Sécurité Spring: ajout de & # 8220; En cas d’écouteur d’événements de connexion réussi & # 8221;
-
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.
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
}