viernes, 15 de julio de 2016

Como obtener datos del usuario tras la autenticación con Spring

En este post hablaremos de como podemos manejar la información del usuario después de que se haya autenticado a través de Spring Security y haciendo uso de uno de sus manejadores.

La idea nace de la necesidad de almacenar determinada información en la sesión del usuario pero haciendo uso de datos específicos que se obtienen una vez que se ha logado en la aplicación.

Se probaron diferentes soluciones como un HttpSessionListener o el uso de filtros, pero no nos valía al no tener unos datos u otros en cada una de las opciones.

La solución se ha implementado haciendo uso de ficheros XML y no anotaciones pero la lógica debe ser básicamente la misma. Para empezar comenzamos configurando el fichero  de configuración de Spring. Debemos indicarle al Filtro encargado de la autenticación en spring-security (en nuestro caso un CAS) que tras una autenticación correcta la lógica pasará por un manejador concreto (en este caso el que nosotros vamos a implementar):

1
2
3
4
5
<bean class="org.springframework.security.cas.web.CasAuthenticationFilter" id="casFilter">
<property name="authenticationManager" ref="authenticationManager"></property>
<property name="authenticationSuccessHandler" ref="successHandler"></property>
</bean>
<bean class="es.home.example.filter.UserDataSessionFilter" id="successHandler"></bean>

Posteriomente creamos la clase que herede de 'SavedRequestAwareAuthenticationSuccessHandler'. En esta clase deberemos implementar el método 'onAuthenticationSuccess' y dentro del mismo realizaremos la lógica que deseemos. Si al terminar el método queremos que siga el flujo normal pre-establecido deberemos hacer uso de la llmada al método de la clase que extiende.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class UserDataSessionFilter extends SavedRequestAwareAuthenticationSuccessHandler {

private PersonaDAO personaDao;

private void initializeDAOs( final ApplicationContext ctx ) {
   if( personaDao == null ) {
      personaDao = (PersonaDAO) ctx.getBean( "PersonaDAO" );
   }
}

public void onAuthenticationSuccess( final HttpServletRequest request, final HttpServletResponse response, final Authentication authentication ) throws IOException, ServletException {
   //Obtenemos la session
   HttpSession session = request.getSession();
   //Obtenemos el application context
   ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext( session.getServletContext() );
   //inicializamos los DAOs
   initializeDAOs( ctx );
   //Realizamos la logica&nbsp;

   //Almacenamos la informacion en la session
   session.setAttribute( SESSIONS_VARS.USER_INFORMATION, userInformation );
   //Seguimos con la logica pre establecida
   super.onAuthenticationSuccess( request, response, authentication );
}
}

No hay comentarios:

Publicar un comentario