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 //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