Vamos ha explicar como configurar fácilmente Spring Security ( Acegi ) para que nos autentique los usuarios mediante Hibernate - Dao.
La única clase que debemos crear es una implementación de la interfaz
org.springframework.security.userdetails.UserDetailsService
que declara un metodo
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
En este método es donde tenemos que realizar toda la recogida de los datos de nuestro modelo de usuarios y roles especifico. Para devolver una instancia de la siguiente clase
org.springframework.security.userdetails.User
El constructor de esta clase recibe un array de GrantedAuthority[] yo he utilizado este metodo para que convertir los nombres de los roles de mi modelo a este Array
- public static GrantedAuthority[] convertToGrantedAuthorityArray(Collection roles) {
- GrantedAuthority[] result = new GrantedAuthority[roles.size()];
-
- int i = 0;
- for (String role : roles) {
- result[i++] = new GrantedAuthorityImpl(role);
- }
-
- return result;
- }
public static GrantedAuthority[] convertToGrantedAuthorityArray(Collection roles) {
GrantedAuthority[] result = new GrantedAuthority[roles.size()];
int i = 0;
for (String role : roles) {
result[i++] = new GrantedAuthorityImpl(role);
}
return result;
}
Lo mas sencillo es añadir una Annotation @Service a la clase y el nombre que le demos a la clase es el que debemos añadir en authentication-provider.
Lo siguiente es añair el filtro en nuestro web.xml y crear el archivo de configuración de spring.
- <filter>
- <filter-name>securityFilter</filter-name>
- <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
- <init-param>
- <param-name>targetBeanName</param-name>
- <param-value>springSecurityFilterChain</param-value>
- </init-param>
- </filter>
-
- <filter-mapping>
- <filter-name>securityFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
securityFilter
org.springframework.web.filter.DelegatingFilterProxy
targetBeanName
springSecurityFilterChain
securityFilter
/*
Para organizarnos mejor creamos un archivo de configuración para el Acegi, en mi caso lo nombro applicationContext-security.xml y yo no tengo que tocar el context-param por le pattern pero sino tendriamos que añadirlo a mano.
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/applicationContext*.xml</param-value>
- </context-param>
contextConfigLocation
/WEB-INF/applicationContext*.xml
Por ultimo personalizamos las reglas de acceso segun necesitemos, aqui pongo un ejemplo sencillo
- <beans:beans xmlns="http://www.springframework.org/schema/security" <brbr="">xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:beans="http://www.springframework.org/schema/beans"
- 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.xsd">
-
- <http auto-config="true" lowercase-comparisons="false">
- <intercept-url pattern="/**/*.html*" access="ROLE_ADMIN,ROLE_USER">
- <form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?error=true" <brbr=""> login-processing-url="/j_security_check"/>
- <logout logout-url="/logout.jsp">
- </logout></form-login></intercept-url></http>
-
- <authentication-provider user-service-ref="ClasequeImplementa">
-
- <global-method-security jsr250-annotations="enabled">
- <protect-pointcut expression="execution(* *..service.UserManager.removeUser(..))" access="ROLE_ADMIN">
- </protect-pointcut></global-method-security>
- </authentication-provider></beans:beans>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
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.xsd">
login-processing-url="/j_security_check"/>
Con esto tendriamos la autenticación, en siguientes posts quisiera poner como encriptar las contraseñas así como utilizar jsr250-annotations