Utilización de grupos en Spring Security

Utilización de grupos en Spring Security

0. Índice de contenidos

1. Introducción

En este primer tutorial que realizo en Autentia vamos a ver, con un sencillo ejemplo, como se configura Spring Security para controlar el acceso a los recursos de una aplicación, por medio de la asignación de roles a grupos de usuarios, los cuales se podrán modificar desde una base de datos.

Spring Security es un subproyecto del framework Spring, que permite gestionar completamente la seguridad de nuestras aplicaciones Java, y cuyas ventajas principales son las siguientes:

  • Es capaz de gestionar seguridad en varios niveles: URLs que se solicitan al servidor, acceso a métodos y clases Java, y acceso a instancias concretas de las clases.

  • Permite separar la lógica de nuestras aplicaciones del control de la seguridad, utilizando filtros para las peticiones al servidor de aplicaciones o aspectos para la seguridad en clases y métodos.

  • La configuración de la seguridad es portable de un servidor a otro, ya que se encuentra dentro del WAR o el EAR de nuestras aplicaciones.

  • Soporta muchos modelos de identificación de los usuarios (HTTP BASIC, HTTP Digest, basada en formulario, LDAP, OpenID, JAAS y muchos más). Además podemos ampliar estos mecanismos implementando nuestras propias clases que extiendan el modelo de Spring Security.

2. Herramientas utilizadas

Este tutorial ha sido desarrollado en Windows Vista, y para su elaboración se han utilizado las siguientes herramientas:

3. Creando una aplicación de prueba

Creamos un nuevo proyecto web dinámico. Podemos darle el nombre que queramos, en mi caso lo he llamado “PruebaSeguridad”.

Vamos a seleccionar el Target Runtime pulsando sobre el botón new.




Seleccionamos como servidor Apache Tomcat 6.




Seleccionamos la ruta donde tenemos instalado el tomcat, en mi caso “C:\Program Files\Apache Software Foundation\apache-tomcat-6.0.18”, y pulsamos finalizar.




Vamos a crear tres sencillas páginas jsp de prueba dentro de la carpeta WebContent.

En la primera, “index.jsp”, mostraremos un menú con dos opciones. Cada opción redirigirá a una de las otras dos páginas, a las cuales restringiremos el acceso más adelante por medio de Spring Security.

El contenido de las otras dos páginas podría ser cualquiera. En “villancicos.jsp”, ya que se acerca la Navidad, mostraremos una lista con algunos villancicos populares, un enlace para poder volver al índice y otro para salir (y poder volver a identificarnos en la aplicación).

La url “j_spring_security_logout” será capturada por el interceptor de Spring Security una vez que lo hayamos configurado, y permitirá hacer logout al usuario, de forma que si intenta acceder de nuevo a un recurso protegido, se le volverán a solicitar los datos de identificación.

En la página de administración, mostraremos un mensaje, un enlace para volver al índice y otro para salir.

Por último, para comprobar que todo funciona correctamente, ejecutamos nuestra pequeña aplicación en el Tomcat y desde un navegador probamos su funcionamiento.







4. Creando una base de datos para gestionar los usuarios, grupos y roles

Creamos un nuevo esquema de base de datos, utilizando una consola del sistema. Deberemos utilizar un usuario con permiso para crear nuevos esquemas en la base de datos.

Para crear el esquema utilizaremos la sentencia: “create schema seguridad;”.




Para crear las tablas hemos utilizado los siguientes scripts.

NOTA: para que el servidor pueda encontrar el driver de MySql habrá que añadir el conector (“mysql-connector-java.jar”) a la carpeta de librerías del Tomcat (“%TOMCAT_DIR%\lib”).

5. Configurando Spring para controlar la seguridad de nuestra aplicación

Antes de nada, deberemos añadir dentro de “WebContent/lib” al menos las siguientes librerías, que se incluyen con Spring y Spring Security:




Creamos el fichero de configuración para Spring Security, dentro de la carpeta WEB-INF, al que llamaremos “applicationContext-security.xml”. El esqueleto básico será el siguiente:

Configuramos los interceptores de Spring Security, y establecemos los permisos adecuados para nuestras páginas:

  • La página de índice no tendrá restringido el acceso.

  • La página de administración tendrá el acceso restringido a los usuarios que tengan el rol “ROLE_ADMIN”.

  • El resto de páginas estarán restringidas a usuarios con el rol “ROLE_USER”.

Spring Security aplicará la lista de interceptores en el orden en que aparece. Cuando encuentre un patrón adecuado, aplicará los permisos correspondientes y no continuará leyendo el resto de interceptores. Por tanto es importante colocar primero los filtros más específicos y después los más generales.

Además indicamos que nos muestre una página de login y el tipo de autenticación que vamos a utilizar, así como la página a la que se debe redirigir al hacer logout.

A continuación configuramos el AuthenticationProvider, que utilizará como UserService una de las implementaciones que vienen con Spring Security: JdbcDaoImpl. Esta implementación nos permite configurar los permisos de los usuarios en una base de datos a la que se accederá por medio de un DataSource.

La propiedad “enableGroups” permite activar el uso de grupos para controlar la seguridad. Es importante cambiar el valor de esta propiedad si queremos utilizar grupos de seguridad, ya que por defecto vale false.

Añadimos el DataSource, indicando el usuario, contraseña y la URL a nuestro esquema de base de datos.

Por último debemos editar la configuración del fichero “web.xml” y añadir las siguientes líneas.

El parámetro de contexto “contextConfigLocation” indica la ruta o rutas de los ficheros de configuración de Spring. En nuestro caso indicamos la ruta del fichero de configuración creado anteriormente.

El ContextLoaderListener se encargará de cargar los ficheros de configuración de Spring indicados en “contextConfigLocation”.

El filtro de seguridad es el encargado de manejar las peticiones que se hagan a todas las URLs para permitir o no el acceso de acuerdo a los permisos que hayamos establecido en el fichero de configuración.

Ahora podemos volver a arrancar nuestro servidor para probar los cambios. Al intentar acceder al listado de villancicos o a la página de administración se nos redirige a una página de login. Todavía no podremos acceder a estas páginas, ya que no hemos creado ningún usuario con los roles adecuados.




6. Añadiendo usuarios, grupos y roles

Ahora que ya está configurada nuestra aplicación de prueba, solamente nos queda añadir los usuarios, grupos y roles a la base de datos.

Añadimos los siguientes usuarios a la tabla USERS:

Añadimos los siguientes grupos a la tabla GROUPS:

A continuación podemos dar roles a los grupos, añadiendo los siguientes registros en la tabla GROUP_AUTHORITIES, que relaciona roles con grupos. En nuestro ejemplo hemos añadido un único rol a cada grupo, pero es posible asignar n roles a cada uno. El grupo ‘invitados’ no tiene ningún rol asignado, por lo que los usuarios que pertenezcan a él no tendrán permisos definidos y no podrán acceder a los recursos protegidos.

Por último, añadimos los usuarios a los grupos, desde la tabla GROUP_MEMBERS, que relaciona grupos con usuarios. Cada usuario podrá pertenecer a varios grupos y sus roles efectivos serán la unión de los roles de cada grupo a los que pertenezca.

De esta forma los usuarios “juan” y “pepe” pertenecerán al grupo “usuarios”, mientras que “lucas” pertenecerá al de “administradores”. “rosa” pertenece al grupo invitados, que no tiene asignado ningún permiso, mientras que “enrique” pertenece tanto al grupo de administradores como al de usuarios.

Efectivamente, no hemos utilizado la tabla AUTHORITIES para nada. Esta tabla permite asignar roles directamente a los usuarios, pero en nuestro caso hemos preferido realizar esta asignación a través de los grupos. No obstante, todavía podríamos asignar permisos directamente a los usuarios si utilizamos esta tabla, de forma que el usuario tendría la suma de sus permisos más los que tengan los grupos a los que pertenece. Si queremos deshabilitar la asignación de permisos directamente a los usuarios (es decir que no se tenga en cuenta la tabla AUTHORITIES) tendremos que asignar el valor false a la propiedad “enableAuthorities” de nuestro UserService:

La propiedad “enableAuthorities” toma el valor true por defecto, al contrario que “enableGroups”. Es importante dejar al menos una de las dos propiedades (enableGroups o enableAuthorities) a true, ya que de lo contrario obtendremos un error de configuración de Spring Security.

Podemos intentar entrar en la aplicación con los distintos usuarios para ver si obtenemos el comportamiento esperado.

Vemos que cualquiera puede acceder a la página de indice, incluso aunque no se haya identificado, pero cuando pulsamos en uno de los enlaces se nos muestra la página de login.

Cuando probamos a acceder con el usuario “lucas” se nos muestra un mensaje indicando que el usuario está deshabilitado (está en inglés, ya que es un formulario de login que implementado por defecto Spring Security).




Cuando probamos con “rosa” ocurre algo parecido, pero esta vez el mensaje es diferente, ya que el usuario no tiene los permisos adecuados.




Por último podemos comprobar que “juan” y “pepe” pueden acceder solamente al listado de villancicos, pero cuando intentan acceder a la página de administración se muestra el siguiente error, ya que no tienen permiso para acceder a la página.


El único usuario al que se permite acceder a la página de administración es “enrique”, ya que lo hemos añadido al grupo de administradores.

7. Conclusiones

A la vista de los resultados de este tutorial podemos sacar las siguientes conclusiones:

  • Spring Security nos ofrece servicios de identificación y acceso a los recursos de nuestras aplicaciones de una forma potente y sencilla, sin tener que escribir ni una sola línea de código.

  • Podemos asignar los permisos directamente a los usuarios o a grupos de usuarios, o incluso mezclar ambas formas.

  • Podemos añadir fácilmente seguridad en nuestras aplicaciones existentes o modificar la seguridad de una aplicación rápidamente, ya que Spring Security separa claramente la seguridad de una aplicación de su lógica.

Y eso es todo. Desde autentia esperamos que este tutorial os haya sido de utilidad y os ayude a gestionar la seguridad de vuestras aplicaciones mediante Spring Security.