Sunday, April 19, 2009

Spring Security Dao Authentication Provider

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
  1. public static GrantedAuthority[] convertToGrantedAuthorityArray(Collection roles) {  
  2.  GrantedAuthority[] result = new GrantedAuthority[roles.size()];  
  3.   
  4.  int i = 0;  
  5.  for (String role : roles) {  
  6.   result[i++] = new GrantedAuthorityImpl(role);  
  7.  }  
  8.   
  9.  return result;  
  10. }  


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.

  1. <filter>  
  2.  <filter-name>securityFilter</filter-name>  
  3.  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
  4.   <init-param>  
  5.    <param-name>targetBeanName</param-name>  
  6.    <param-value>springSecurityFilterChain</param-value>  
  7.   </init-param>  
  8. </filter>  
  9.   
  10. <filter-mapping>  
  11.  <filter-name>securityFilter</filter-name>  
  12.  <url-pattern>/*</url-pattern>  
  13. </filter-mapping>  


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.

  1. <context-param>  
  2.  <param-name>contextConfigLocation</param-name>  
  3.  <param-value>/WEB-INF/applicationContext*.xml</param-value>  
  4. </context-param>  


Por ultimo personalizamos las reglas de acceso segun necesitemos, aqui pongo un ejemplo sencillo

  1. <beans:beans xmlns="http://www.springframework.org/schema/security" <brbr="">xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2. xmlns:beans="http://www.springframework.org/schema/beans"  
  3. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd  
  4. http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd">  
  5.   
  6.  <http auto-config="true" lowercase-comparisons="false">  
  7.   <intercept-url pattern="/**/*.html*" access="ROLE_ADMIN,ROLE_USER">  
  8.   <form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?error=true" <brbr="">  login-processing-url="/j_security_check"/>  
  9.   <logout logout-url="/logout.jsp">  
  10.  </logout></form-login></intercept-url></http>  
  11.   
  12.  <authentication-provider user-service-ref="ClasequeImplementa">  
  13.   
  14. <global-method-security jsr250-annotations="enabled">  
  15.  <protect-pointcut expression="execution(* *..service.UserManager.removeUser(..))" access="ROLE_ADMIN">  
  16. </protect-pointcut></global-method-security>  
  17. </authentication-provider></beans:beans>  


Con esto tendriamos la autenticación, en siguientes posts quisiera poner como encriptar las contraseñas así como utilizar jsr250-annotations

1 comment:

  1. existira la forma de obtener los roles de la base de datos y de alguna tabla determinar los permisos por usuario, es decir por ejemplo aca estan en duro 2 roles para las paginas "/**/*.html, se podra esto obtener de la base de datos y poder programar un creadro de roles y permisos por base de datos.

    ReplyDelete