Siguiendo con el articulo anterior, voy a explicar los diferentes Filtros de Seguridad y las Configuraciones Personales que podemos aplicar en nuestra Seguridad. El siguiente gráfico explica el ciclo de vida de la autentificación en Spring.
En el post anterior, vimos el Bean del Formulario de logeo, donde se creo el objeto Authentication que se pasa al AuthenticationManager.
UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(userName, password); ....... Authentication auth = getAuthenticationManager().authenticate(authReq);
AuthenticationManager
El bean AuthenticationManager es del tipo ProviderManager, lo que significa que actúa de proxy con AuthenticationProvider. En Spring, el AuthenticationProvider es el encargado de validar la combinación nombre de usuario/contraseña por medio del objeto Authentication y retornar los roles asociados a dicho usuario. Esta clase tan sólo delega la autenticación en una lista de proveedores configurable, cada uno de los cuales implementa el interfaz AuthenticationProvider. Hay muchos tipos de AuthenticationProvider( JDBC, Hibernate, LDAP, RememberMe, OpenID). Usted puede indicar cuales quiere usar son los proveedores de autentificación que desee usar, en nuestro caso, usaremos un DAO Hibernate personalizado.
<bean id="authenticationManager" class="paquete.MiAuthenticationManager"> <property name="providerString" value="userDaoProvider" /> </bean>
public class MiAuthenticationManager extends ProviderManager { protected String providerString; public void setProviderString(String providerString) { this.providerString = providerString; } /** * Agrega al Manejador de Proveedores un listado */ public void afterPropertiesSet() throws Exception { if (providerString != null) { List<authenticationprovider> providers = new LinkedList(); String[] names = providerString.split(","); for (String providerUnit : names) { AuthenticationProvider provider = (AuthenticationProvider) applicationContext .getBean(providerUnit.trim()); if (provider == null) { throw new EnMeExpcetion("AuthenticationProvider " + providerUnit + " don't exist"); } providers.add(provider); } setProviders(providers); } super.afterPropertiesSet(); } } </authenticationprovider>
DaoAuthenticationProvider
DaoAuthenticationProvider, es el comúnmente usado puesto que es el que permite acceder a la información almacenada en una base de datos. El proveedor DaoAuthenticationProvider merece una mención especial. Esta implementación delega a su vez en un objeto de tipo UserDetailsService, un interfaz que define un objeto de acceso a datos con un único método loadUserByUsername que permite obtener la información de un usuario a partir de su nombre de usuario.
<bean id="userDaoProvider" class="org.springframework.security.providers.dao.DaoAuthenticationProvider"> <property name="userDetailsService" ref="dbUserService" /> </bean>
Si deseas agregarle encriptación a la contraseña del usuario, agregale una propiedad más al userDaoProvider, este artÃculo que escribi tiempo atrás te ayudará a poner una mejor seguridad que el tipico MD5.
UserDetailsService, un Dao Personalizado
Si no queremos que Spring acceda a la bases de datos directamente podemos configurar un Dao personalizado por medio de una Implementación UserDetailsService, , un interfaz que define un objeto de acceso a datos con un único método loadUserByUsername que permite obtener la información de un usuario a partir de su nombre de usuario.
<bean id="dbUserService" class="paquete.MiUserServiceImp"> <property name="userDao" ref="userDao" /> </bean>
public class MiUserServiceImp implements UserDetailsService { ...... public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { SecUsers user = userDao.getUser(username); if (user == null) { log.info("no encontrado..."); throw new UsernameNotFoundException("username"); } return convertToUserDetails(user); } ...... protected UserDetails convertToUserDetails(SecUsers user){ //lista de permisos, List<string> listPermissions = new ArrayList</string><string>(); ........... GrantedAuthority[] authorities = new GrantedAuthority[listPermissions .size()]; int i = 0; for (String permission : listPermissions) { authorities[i++] = new GrantedAuthorityImpl(permission.trim()); } User userDetails = new User(user.getUsername(), user.getPassword(), user.isStatus() == null ? false : user.isStatus(), true, true, true, authorities); log.info("userDetails "+userDetails); return userDetails; } } </string>
Vamos a dejar la explicación de los Filtros, para una tercera parte, ya se hizo largo
.



Ignacio
on Jul 12th, 2010
@ 9:19:
Hola, muy buen tutorial!!
Me gustaria consultarte porque no entiendo bien el metodo afterPropertiesSet.
AuthenticationProvider provider = (AuthenticationProvider) applicationContext
.getBean(providerUnit.trim());
Con respecto al bean que estas llamando. De donde sale ese providerString ??? Lo setea Spring??? No puedo seguir bien el hilo de esta parte.
Muy bueno el tutorial.
Saludos,
Ignacio