
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.
0 comentarios:
Publicar un comentario