Spring Security – Introducción a la seguridad declarativa

Esta va ser la primera de las n entradas que vamos a dedicar a Spring Security. Para los que todavía no lo conocen, Spring Security es uno de los framework de seguridad J2EE más populares y completos usado por parte de instituciones, empresas e universidades muy importantes. Con Spring Security es bastante trivial incorporar la infraestructura básica de seguridad en una aplicación ya implementada sin necesidad de escribir ni una línea de código gracias a su naturaleza no invasiva. Además, posee componentes ya implementados que permiten la integración con sistemas externos con mucha facilidad. Inicialmente fue basado en el proyecto Acegi Security, que con los años se fue convirtiendo en un producto robusto y maduro, actualmente miembro de la familia de productos Spring. Debido a que muchos de los conceptos como la inyección de dependencias y programación orientada a aspectos los hereda de Spring, es aconsejable que tengamos nociones básicas de las mismas.

La seguridad de la aplicación en sí se considera como un requisito transversal, y por lo tanto se puede encapsular en forma de aspecto y más tarde aplicarse de forma declarativa en cualquier punto de nuestra aplicación. Spring Security ofrece módulos que aíslan ese tipo de lógica, permitiendo además que la aplicación tenga una arquitectura robusta, limpia y débilmente acoplada.

Otro de los elementos que ayuda a que los componentes de nuestra aplicación tengan acoplamiento bajo es el patrón de diseño llamado inyección de dependencias. En vez de que las clases se encarguen de obtener sus propias referencias, éstas son instanciadas e inyectadas desde una entidad externa llamada contenedor. El bajo acoplamiento también se consigue con las interfaces. Es importante que los objetos conozcan sus referencias a través de las interfaces, ya que se consigue ocultar la implementación y cambiarla sin necesidad de tocar la referencia. Para cualquier proyecto no trivial es casi un patrón de uso obligatorio. Para más información se puede consultar el manual de Spring.

Como esta entrada va a ser mera introducción teórica, no vamos a entrar en los detalles de configuración y puesta en marcha del framework, sino simplemente conocer la arquitectura básica y todas las posibilidades que nos ofrece.

Spring Security trata dos aspectos de seguridad fundamentales: autorización e autenticación. Para eso ofrece toda una serie de filtros que se encargan de interceptar las peticiones HTTP y aplicar procesamientos de índole variada antes de que estas alcancen el destino final. Como símil pensemos por un momento en la cebolla y las capas que la forman: para llegar al corazón es necesario quitar todas las capas. De la misma forma, la petición tiene que pasar por toda la cadena de interceptores antes de alcanzar el destino. En la plataforma J2EE los filtros son artefactos representados por la interfaz javax.servlet.Filter, y a menudo combinados en la cadena de filtros a través de la interfaz javax.servlet.FilterChain siguiendo un orden determinado. Así, por ejemplo, antes de que al usuario se le acceda acceso a un recurso determinado como puede ser una página o invocación a un método, el primer filtro de la cadena se encargará de comprobar si el usuario está autenticado en el sistema. El siguiente paso consiste a partir de la entidad determinar si el usuario tiene permisos suficientes para acceder al recurso, etc. Spring Security ofrece su propia abstracción de la cadena de filtros, permitiendo crearlo dinámicamente a través del fichero de configuración como veremos en las entradas siguientes.

La protección de los métodos de la capa de negocio se realiza a través de aspectos y se puede securizar la invocación al método, antes y después. Las llamadas a los métodos se protegen utilizando anotaciones Java estándar, o bien mediante declaraciones de puntos de corte para la protección global de los servicios.

Para el proceso de autenticación tenemos a nuestra disposición un gran número de mecanismos, y además la posibilidad de extender el propio framework y crear nuestro propio proveedor de autenticación. Los datos que precisa el proveedor para la correcta autenticación de los usuarios se pueden almacenar en memoria (útil en las fases de desarrollo o pruebas sencillas), bases de datos relacionales, repositorios LDAP, sistemas OpenID o Kerberos entre otros. Para el usuario queda totalmente transparente la forma de autenticación, por lo que en una aplicación funcionando en entorno de producción podemos cambiar el tipo de autenticación sin tocar el propio código.

Las posibilidades de Spring Security no acaban aquí. En los proveedores de autenticación que utilizan las bases de datos relacionales es posible incrementar el nivel de protección de las contraseñas a través de algoritmos de encriptación adicionales. Además, ofrece técnicas para el control de sesiones y nos protege de ataques que pueden provocar el robo de las mismas. Para algunos servicios como el remember me, login o logut, dispone de componentes ya implementados y listos para usarlos en nuestras aplicaciones.

En la siguiente entrada veremos como configurar el framework y crear una aplicación sencilla. Además entraremos en más detalle con las clases involucradas en el proceso de autenticación e autorización. Manténganse a la escucha.

Comments

  1. Interesante Entrada Nedim.

    Intentare segurir el resto de la serie :-)

  2. Me ha encantado Nedim! Estoy impaciente por leer la siguiente!

  3. Gran entrada Nedo!
    Me alegra ver la facilidad y naturalidad con la que tratas el tema, sigue así joven padawan ^_^

  4. buena entrada, he llegado tarde, lo se, es una constante en mi vida :)
    gracias.