Domanda

Sono nuovo di Spring Security. Come faccio ad aggiungere un listener di eventi che verrà chiamato come utente che accede correttamente? Inoltre ho bisogno di ottenere una sorta di ID sessione univoco in questo listener che dovrebbe essere disponibile più avanti. Ho bisogno di questo ID per sincronizzarmi con un altro server.

È stato utile?

Soluzione

Devi definire un Spring Bean che implementa ApplicationListener .

Quindi, nel tuo codice, fai qualcosa del genere:

public void onApplicationEvent(ApplicationEvent appEvent)
{
    if (appEvent instanceof AuthenticationSuccessEvent)
    {
        AuthenticationSuccessEvent event = (AuthenticationSuccessEvent) appEvent;
        UserDetails userDetails = (UserDetails) event.getAuthentication().getPrincipal();

        // ....
    }
}

Quindi, nel tuo file applicationContext.xml, definisci quel bean e inizierà automaticamente a ricevere eventi :)

Altri suggerimenti

Il problema con AuthenticationSuccessEvent è che non viene pubblicato al login di ricordami. Se si utilizza l'autenticazione Remember Me, utilizzare invece InteractiveAuthenticationSuccessEvent, funziona sia per l'accesso normale che per l'accesso Ricorda me.

@Component
public class LoginListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> {

    @Override
    public void onApplicationEvent(InteractiveAuthenticationSuccessEvent event)
    {
        UserDetails userDetails = (UserDetails) event.getAuthentication().getPrincipal();
        // ...
    }
}

Simile alla risposta di Phill, ma modificato per prendere in considerazione Generics:

public class AuthenticationListener implements ApplicationListener<AuthenticationSuccessEvent> {

  @Override
  public void onApplicationEvent(final AuthenticationSuccessEvent event) {

      // ...

  }

}

In Grails, con Spring Security Plugin, puoi farlo in Config.groovy:

grails.plugins.springsecurity.useSecurityEventListener = true

grails.plugins.springsecurity.onAuthenticationSuccessEvent = { e, appCtx ->

        def session = SecurityRequestHolder.request.getSession(false)
        session.myVar = true

}

Un altro modo di usare @EventListener

@EventListener
public void doSomething(InteractiveAuthenticationSuccessEvent event) { // any spring event
    // your code 

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top