Mam aplikację webową java za pomocą Spring 3.1. Kontekst zabezpieczeń w Springu definiuje wiele filtrów uwierzytelniania, z których każdy odpowiada innej ścieżce uwierzytelniania (np. Nazwa użytkownika/hasło kontra logowanie jednokrotne). Każdy filtr autoryzacji definiuje swój własny AuthenticationSuccessHandler
. Teraz chcę, aby wstrzyknąć 2 dodatkowe działania podjąć po pomyślnym uwierzytelnieniu i powinny one mieć zastosowanie wszystkie typy uwierzytelniania:Najczystszy sposób wywoływania wielu uwierzytelnień AuthenticationSuccessHandlers?
- ustawić kod zdarzenia śledzenia Google Analytics do wykorzystania na front-end
- zaktualizuj preferowane ustawienia użytkownika w naszej bazie danych
Może to być dowolna czynność, do której chcesz uzyskać dostęp, po pomyślnym uwierzytelnieniu użytkownika. Ważne jest to, że w przeciwieństwie do zwykłych identyfikatorów AuthenticationSuccessHandlers (które są różne dla każdej ścieżki uwierzytelniania), nie przekazują dalej ani nie przekierowują żądania. Więc bezpiecznie można nazwać ich gromadą.
Czy istnieje czysty sposób na integrację tych dodatkowych "udanych" działań związanych z uwierzytelnianiem za pomocą Spring Web/Security 3.1?
Spojrzałem na wdrożenie ApplicationListener<AuthenticationSuccessEvent>
, ale moje wydarzenia potrzebują dostępu do żądania, a wszystko AuthenticationSuccessEvent
zapewnia to sam obiekt Authentication
.
nie mogłem znaleźć sposób, więc zdecydowałem się toczyć własną Proxy:
public class AuthenticationSuccessHandlerProxy implements AuthenticationSuccessHandler {
private List<AuthenticationSuccessHandler> authenticationSuccessHandlers;
public AuthenticationSuccessHandlerProxy(List<AuthenticationSuccessHandler> successHandlers) {
this.authenticationSuccessHandlers = successHandlers;
}
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
for (AuthenticationSuccessHandler successHandler : this.authenticationSuccessHandlers) {
successHandler.onAuthenticationSuccess(request, response, authentication);
}
}
}