Mam aplikacji Wiosna-MVC (tj używam wiosną za dyspozytora serwletu). Używam także Spring Security do uwierzytelniania użytkowników. Ponieważ używam wiosną za dyspozytora serwletu, nie trzeba deklarowaćDostęp RequestContextHolder i HttpServletRequest.getUserPrincipal() z AuthenticationSuccessHandler
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
w moim web.xml, aby móc użyć RequestContextHolder
(jeśli dobrze rozumiem, dokumentacja).
Moje pytanie odnosi się do mojej implementacji interfejsu 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
}
}
mógłbyś wyjaśnić dlaczego w powyższym kodzie, RequestContextHolder.currentRequestAttributes()
i HttpServletRequest.getUserPrincipal()
nie działa (działają one wewnątrz Controller)?
Dzięki!
EUH, masz już „RequestContextHolder.currentRequestAttributes” (jest to metoda parametr request), i masz już kapitał (jest to metoda uwierzytelniania parametr). Bezsensowne pytanie. BTW, owijanie wniosku o dostarczenie jej mocodawcy, odbywa się w SecurityContextHolderAwareRequestFilter, który przychodzi po form-login (a więc po obsługi sukces). – MikeN