Sécurité Spring: ajout de & # 8220; En cas d’écouteur d’événements de connexion réussi & # 8221;

StackOverflow https://stackoverflow.com/questions/182160

  •  05-07-2019
  •  | 
  •  

Question

Je suis nouveau dans 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 me synchroniser avec un autre serveur.

Était-ce utile?

La solution

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

Ensuite, dans votre code, faites quelque chose comme ceci:

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:)

Autres conseils

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

@Component
public class LoginListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> {

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

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) {

      // ...

  }

}

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

}

Une autre façon d'utiliser @EventListener

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

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top