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.
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 :)
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();
// ...
}
}
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
}