2008-10-08 5 views
32

Ich bin neu bei Spring Security. Wie füge ich einen Ereignis-Listener hinzu, der aufgerufen wird, wenn sich ein Benutzer erfolgreich anmeldet? Außerdem muss ich eine einzigartige Sitzungs-ID in diesem Listener erhalten, die weiter verfügbar sein sollte. Ich brauche diese ID, um mit einem anderen Server zu synchronisieren.Spring Sicherheit: Hinzufügen "Bei erfolgreichem Login-Ereignis Listener"

Antwort

41

Sie müssen eine Spring Bean definieren, die ApplicationListener implementiert.

Dann in Ihrem Code, tun Sie etwas wie folgt aus:

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

     // .... 
    } 
} 

Dann in Ihrer applicationContext.xml Datei definieren nur die Bohne und es startet automatisch Ereignisse Empfang :)

+0

Danke! Habe gerade AuthenticationSuccessEvent gefunden, versuchte aber herauszufinden, wie man einen Listener registriert. – axk

+2

Was ist mit der Sitzungs-ID, nach der er gefragt hat? – siebmanb

+1

@siebmanb fügen Sie dem Hörer nur '@Autowired HttpSession session' hinzu. Spring wird einen Proxy eingeben, der automatisch an die Korrektursitzung delegiert. –

10

In Grails , mit Spring Security Plugin, können Sie dies in Config.groovy tun:

grails.plugins.springsecurity.useSecurityEventListener = true 

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

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

} 
+0

Richtiger Weg, um eine Anfrage in Config.Groovy zu bekommen def Anfrage = RequestContextHolder? .currentRequestAttributes(); – openSource

+1

Kann jemand den aktuellen angemeldeten Benutzer in diesem Ereignis erhalten? Ich benutze derzeit 'def springSecurityService = Holders.grailsApplication.mainContext.getBean 'springSecurityService'; def user = springSecurityService.getPrincipal() 'aber Benutzer ist immer Null. Vielen Dank! EDIT: Sieht aus wie def user = event.getAuthentication(). GetPrincipal() funktioniert gut! – Dinoo

21

Ähnlich wie Phill Antwort, aber modifizierte Generics zu berücksichtigen:

public class AuthenticationListener implements ApplicationListener<AuthenticationSuccessEvent> { 

    @Override 
    public void onApplicationEvent(final AuthenticationSuccessEvent event) { 

     // ... 

    } 

} 
38

Das Problem mit AuthenticationSuccessEvent ist, dass es nicht auf remember-me Login veröffentlicht wird. Wenn Sie die remember-me-Authentifizierung verwenden, verwenden Sie stattdessen InteractiveAuthenticationSuccessEvent. Dies funktioniert sowohl für die normale als auch für die remember-me-Anmeldung.

@Component 
public class LoginListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> { 

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

Vielen Dank! Ich habe versucht, dies zu erreichen, indem Sie auth-success-handler, aber mit diesem Problem konfrontiert: http://stackoverflow.com/questions/11575860/remember-me-and-authentication-success-handler. Deine Antwort hat die Situation gerettet! – yname

Verwandte Themen