Tengo una aplicación Spring-MVC (es decir, estoy utilizando el servlet despachador de Spring). También estoy usando Spring Security para autenticar usuarios. Desde que uso servlet despachador de la primavera, que no tienen que declararAcceso a RequestContextHolder y HttpServletRequest.getUserPrincipal() de AuthenticationSuccessHandler
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
en mi web.xml con el fin de poder utilizar RequestContextHolder
(si he entendido bien la documentación).
Mi pregunta se refiere a la implementación de la interfaz org.springframework.security.web.authentication.AuthenticationSuccessHandler
:
public class AuthenticationSuccessHandlerImpl implements AuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {
int timeout = 60*60;
//does work
request.getSession().setMaxInactiveInterval(timeout); //60 minutes
System.out.println("Session timeout of user: " + authentication.getName() + " has been set to: " + timeout + " seconds.");
/*
//does not work
session().setMaxInactiveInterval(timeout); //60 minutes
System.out.println("Session timeout of user: " + request.getUserPrincipal().getName() + " has been set to: " + timeout + " seconds.");
*/
//now restore the default work flow (SavedRequestAwareAuthenticationSuccessHandler is the default AuthenticationSuccessHandler that Spring uses,
// see: http://static.springsource.org/spring-security/site/docs/3.0.x/reference/core-web-filters.html#form-login-flow-handling)
(new SavedRequestAwareAuthenticationSuccessHandler()).onAuthenticationSuccess(request, response, authentication);
}
public static HttpSession session() {
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
return attr.getRequest().getSession(true); // true == allow create
}
}
Podría explicar por qué en el código mencionado anteriormente, RequestContextHolder.currentRequestAttributes()
y HttpServletRequest.getUserPrincipal()
no funcionan (que funcionan dentro de un Controlador)?
Gracias!
Euh, ya tiene 'RequestContextHolder.currentRequestAttributes' (es el parámetro del método de solicitud), y ya tiene el principal (es el parámetro del método de autenticación). Bit pregunta sin sentido. Por cierto, el ajuste de la solicitud, para proporcionarle un principal, se realiza en SecurityContextHolderAwareRequestFilter, que viene después del inicio de sesión de formulario (y, por lo tanto, después del controlador de éxito). – MikeN