web-dev-qa-db-fra.com

Sécurité de printemps: ajout de "Sur l'écouteur d'événement de connexion réussie"

Je suis nouveau à Spring Security. Comment ajouter un écouteur d'événement qui sera appelé lorsqu'un utilisateur se connecte avec succès? De plus, je dois obtenir un identifiant de session unique dans cet écouteur, qui devrait être disponible plus tard. J'ai besoin de cet identifiant pour se synchroniser avec un autre serveur.

35
axk

Vous devez définir un bean Spring qui implémente ApplicationListener .

Ensuite, dans votre code, faites quelque chose comme ça:

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

        // ....
    }
}

Ensuite, dans votre fichier applicationContext.xml, définissez simplement ce bean et il commencera automatiquement à recevoir des événements :)

46
user7094

Le problème avec AuthenticationSuccessEvent est qu’il n’est pas publié lors de la connexion de Remember-me. Si vous utilisez l'authentification Remember-Me, utilisez plutôt InteractiveAuthenticationSuccessEvent, cela fonctionne aussi bien pour une connexion normale que pour une connexion Remember-me.

@Component
public class LoginListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> {

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

Semblable à la réponse de Phill, mais modifié pour prendre en compte les génériques:

public class AuthenticationListener implements ApplicationListener<AuthenticationSuccessEvent> {

  @Override
  public void onApplicationEvent(final AuthenticationSuccessEvent event) {

      // ...

  }

}
24
user1857829

Dans Grails, avec Spring Security Plugin, vous pouvez le faire dans Config.groovy:

grails.plugins.springsecurity.useSecurityEventListener = true

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

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

}
10
Wanderson Santos

Une autre façon d'utiliser @EventListener

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

}
0
Sujit