2013-08-08 17 views
5

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?

  1. ustawić kod zdarzenia śledzenia Google Analytics do wykorzystania na front-end
  2. 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); 
     } 
    } 
} 

Odpowiedz

0

Po patrząc breafly do kodu źródłowego AbstractAuthenticationProcessingFilter i wszystkich innych miejscach, gdzie AuthenticationSuccessHandler.onAuthenticationSuccess(...) nazywa ja nie widzę żadnych możliwość zrobienia tego przy użyciu Spring Security.

Aby obejść ten problem, można spróbować zawinąć narzędzia do obsługi sukcesu w niektórych punktach AspectJ lub AOP, a następnie zastosować ten punkt cięcia do wykonania AuthenticationSuccessHandler.onAuthenticationSuccess(...). Może tak, możesz kierować wszystkie typy uwierzytelniania.

Powiązane problemy