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?
- impostare un codice di evento di monitoraggio per Google Analytics per l'uso sul front-end
- 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);
}
}
}