Esta configuración funciona perfectamente, con Spring Security 2.0 y JDBC, despues de varios dias probando configuraciones diferentes, puedo concluir dos cosas, que la versión de Spring Security tiene un bug en su versión 2.0.8.
Yo usé mis propias tablas, pero para los nuevos, pueden usar las que trae por defecto programadas, las que estan aabajo de este artÃculo, yo cree unas similares, pero en mi caso necesitaba otras moficiaciones, tablas con mas columnas para mi aplicación. El problema, es que si tu usar la nueva caracteristica de esta versión group-authorities-by-username-query vas a tener un problema, pues aunque pongas tu propia configuración necesitas tener las tablas de groups,group_authorities y group_members en tu base de datos, aunque no estén siendo usadas, porque sinó, no te funcionará. Abajo les dejo la configuración que usé.
En el web.xml
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext-security.xml</param-value> </context-param> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping>
applicationContext-security.xml
<!-- CONFIGURACION VALIDA PARA SPRING SECURITY 2.0 con JDBC Author: www.jotadeveloper.com http://blog.jotadeveloper.com/2008/11/21/configuracion-spring-security-20-con-jdbc/ --> <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd"> <!-- CONFIGURACION VALIDA PARA SPRING SECURITY 2.0 con JDBC --> <http auto-config="true" access-denied-page="/web/error.do"> <intercept-url pattern="/" access="IS_AUTHENTICATED_ANONYMOUSLY" /> <intercept-url pattern="/login.do" access="IS_AUTHENTICATED_ANONYMOUSLY" /> <intercept-url pattern="/j_spring_security_switch_user" access="ROLE_SUPERVISOR" /> <intercept-url pattern="/web/css/**" access="ROLE_WEBMASTER" /> <intercept-url pattern="/templates/**" access="ROLE_WEBMASTER" /> <intercept-url pattern="/web/error/**" access="ROLE_USER" /> <form-login login-page="/login.do" default-target-url='/web/index.do' authentication-failure-url="/login.do?login_error=1" /> <logout logout-success-url="/" invalidate-session="true"/> </http> <authentication-provider user-service-ref="userService" /> <!-- MYSQL --> <beans:bean id="securityDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <beans:property name="driverClassName" value="org.gjt.mm.mysql.Driver" /> <beans:property name="url" value="jdbc:mysql://localhost/test" /> <beans:property name="username" value="root" /> <beans:property name="password" value="" /> </beans:bean> <jdbc-user-service id="userService" data-source-ref="securityDataSource" group-authorities-by-username-query="SELECT g.nombre, a.rol FROM dbo.bm_usuario u INNER JOIN dbo.bm_grupo_usuario ug ON (u.id_usuario = ug.id_usuario) INNER JOIN dbo.bm_grupo g ON (ug.id_grupo = g.id_grupo) INNER JOIN dbo.bm_grupos_roles ON (g.id_grupo = dbo.bm_grupos_roles.id_grupo) INNER JOIN dbo.bm_roles a ON (dbo.bm_grupos_roles.id_rol = a.id_rol) WHERE u.nombreUsuario = ? " users-by-username-query="SELECT u.nombreUsuario AS Login, u.password AS Password, u.enabled AS Enabled FROM dbo.bm_usuario u WHERE u.nombreUsuario = ?" authorities-by-username-query="SELECT u.nombreUsuario, au.rol FROM dbo.bm_usuario_roles ua INNER JOIN dbo.bm_usuario u ON (ua.id_usuario = u.id_usuario) INNER JOIN dbo.bm_roles au ON (ua.id_rol = au.id_rol) WHERE u.nombreUsuario = ? " /> </beans:beans>
Las tablas para que esto funcione. OJO, aviso que este SQL no es el mismo que yo usé en mi ejemplos, es similar pero para SQL Server, con algunas modfiicaciones a las tablas originales.
<!-- SQL --> CREATE TABLE users( username varchar_ignorecase(50) NOT NULL PRIMARY KEY, password varchar_ignorecase(50) NOT NULL, enabled BOOLEAN NOT NULL); <!--Tabla de Roles --> CREATE TABLE authorities ( username varchar_ignorecase(50) NOT NULL, authority varchar_ignorecase(50) NOT NULL, constraint fk_authorities_users FOREIGN KEY(username) REFERENCES users(username)); CREATE UNIQUE INDEX ix_auth_username ON authorities (username,authority); CREATE TABLE groups ( id bigint generated BY DEFAULT AS identity(start WITH 0) PRIMARY KEY, group_name varchar_ignorecase(50) NOT NULL); <!--Tabla de Grupos Roles--> CREATE TABLE group_authorities ( group_id bigint NOT NULL, authority varchar(50) NOT NULL, constraint fk_group_authorities_group FOREIGN KEY(group_id) REFERENCES groups(id)); <!--Tabla de Grupos Usuarios--> CREATE TABLE group_members ( id bigint generated BY DEFAULT AS identity(start WITH 0) PRIMARY KEY, username varchar(50) NOT NULL, group_id bigint NOT NULL, constraint fk_group_members_group FOREIGN KEY(group_id) REFERENCES groups(id));


Jose Ayerdis
on Dic 5th, 2009
@ 22:03:
no se por que nadie te ha comentado pero el tutorial esta muy bueno. Por cierto la parte del SQL que pusistes ahi en las tablas no va concordar ese es el que vos hicistes propio y en la configuracion de spring usastes el default??
PD. suscrito a tu blog
jpicado
on Dic 6th, 2009
@ 9:09:
Si, ahi puse que la configuracion que ojo, al configuracion de las tablas no es la misma de la del ejemplo. La configuracion que use en spring security es la por defecto, pero puedes hacer una mucho mas avanzada. Tambien quiero recalcar, que la configuracion JDBC no es la mejor, pero es una solucion para salir del problema, es mejor extender otras clases de spring security y hacerla con Hibernate, iBatis o lo que se les ocurra, para mantener la capa acceso a datos los mas alejado de spring secutity y hacerla menos intrusiva. Lo bueno de spring security es que no se mete en tu logica de negocio, aunque este tutorial hace lo contrario, pero repito, es una solucion rapida con una configuracion sencilla, en este blog podras encontrar otros tutoriales algo mas avanzados.
Jose Ayerdis
on Dic 6th, 2009
@ 14:01:
Sabes algo que no entiendo si yo tengo varios roles para los usuarios tomara todos o solo el ultimo.
Ejemplo
Authority username
ROLE_USER 'jose'
ROLE_WEBMASTER 'jose'
Eso se traduce en que jose tiene roles de user y de webmaster?
PD. ahorate sigo por reader