2013-08-08 52 views
5

Ho una webapp java che utilizza Spring 3.1. Il contesto di sicurezza My Spring definisce più filtri di autenticazione, ciascuno corrispondente a un diverso percorso di autenticazione (ad es. Nome utente/password vs. Single Sign On). Ogni filtro di autenticazione definisce il proprio AuthenticationSuccessHandler. Ora, voglio iniettare 2 ulteriori azioni a prendere su di autenticazione, e dovrebbero applicare in tutta tutti i tipi di autenticazione:Il modo più semplice per chiamare più AuthenticationSuccessHandlers?

  1. impostare un codice di evento di monitoraggio per Google Analytics per l'uso sul front-end
  2. aggiornare le impostazioni locali preferite dell'utente nel nostro database

Queste potrebbero essere tutte le azioni per le quali si desidera un hook, dopo che l'utente è stato autenticato correttamente. Il punto importante è che, a differenza dei normali AuthenticationSuccessHandlers (che sono diversi per ogni percorso di autenticazione), non inoltrano o reindirizzano la richiesta. Quindi è sicuro chiamare un gruppo di loro.

C'è un modo pulito per integrare queste "azioni" di autenticazione di successo aggiuntive, utilizzando Spring Web/Security 3.1?

ho guardato in attuazione di un ApplicationListener<AuthenticationSuccessEvent>, ma i miei eventi hanno bisogno di accedere alla richiesta, e tutto AuthenticationSuccessEvent fornisce è l'oggetto Authentication stesso.

non riuscivo a trovare un modo, così ho deciso di rotolare il mio delega:

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); 
     } 
    } 
} 

risposta

0

Dopo aver guardato breafly nel codice sorgente di AbstractAuthenticationProcessingFilter e tutti gli altri luoghi dove AuthenticationSuccessHandler.onAuthenticationSuccess(...) è chiamato non vedo alcun possibilità di farlo utilizzando Spring Security.

Come soluzione alternativa, è possibile provare a racchiudere i gestori di successo in alcuni pointcut AspectJ o AOP e quindi applicare questo pointcut all'esecuzione di AuthenticationSuccessHandler.onAuthenticationSuccess(...). Forse in questo modo puoi scegliere come target tutti i tipi di autenticazione.

Problemi correlati