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

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.



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.



contextConfigLocation
/WEB-INF/applicationContext*.xml



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


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

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