2010-12-28 7 views
0

Ich schreibe eine Web-Anwendung mit Grails und Feder-Sicherheit 3.0.3, die ich eine Datenbank Aufzeichnung aller erfolgreichen Logins, einschließlich der erfordert Benutzername, Uhrzeit, IP und Sitzungs-ID.Ich kann keine Sitzungs-ID für "remember me" Benutzer im Frühling Sicherheit Login Ereignis Listener

Ich habe einen Login-Hörer wie so (groovy Code) erstellt:

class DpLoginListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> { 
    void onApplicationEvent(InteractiveAuthenticationSuccessEvent event) { 
     def source = event.getSource() 
     def principal = source.principal 
     def details = source.details 
     TrafficLogin.withTransaction { 
      new TrafficLogin(userId: principal.id, ipAddress: details.remoteAddress, sessionId: details.sessionId ?: 'remember me').save(failOnError: true) 
     } 
    } 
} 

Diese Brände wie erwartet, wenn sich ein Benutzer anmeldet, aber wenn jemand auf eine Website als „remember me“ kommt zurück Benutzer, Die Sitzungs-ID ist null. Ist das das erwartete Verhalten? Sollte zu dem Zeitpunkt, zu dem die Anmeldung erfolgreich war, keine Sitzung erstellt werden?

Ich habe versucht, dies zu umgehen, indem Sie einen separaten SessionCreationEvent-Listener hinzufügen, der den neuesten Datenbankanmeldedatensatz für den Benutzer finden und diese Zeile mit der richtigen Sitzungs-ID aktualisieren würde, sobald die Sitzung existiert, aber dieses Sitzungserstellungs-Ereignis scheint feuert nie, und ich kann nicht herausfinden, warum.

Die Sitzung Schöpfung Zuhörer sieht wie folgt aus:

class DpSessionCreatedListener implements ApplicationListener<SessionCreationEvent> { 
    void onApplicationEvent(SessionCreationEvent event) { 
    def source = event.getSource() 
    def principal = source.principal 
    def details = source.details 
    TrafficLogin.withTransaction { 
     def rememberMe = TrafficLogin.find("from TrafficLogin as t where t.userId=? and t.sessionId='remember me' order by t.dateCreated desc", principal.id) 
     if (rememberMe) { 
     rememberMe.sessionId = details.sessionId 
     rememberMe.save(failOnError:true) 
     } 
    } 
    } 
} 

Und eine Bohne ist für sie in meiner resources.groovy-Datei definiert, in der gleichen Weise wie der Login-Hörer, die feine abfeuert.

Haben Sie Ideen, wie Sie diese SessionId richtig einstellen?

Antwort

2

Nicht im Zusammenhang mit Grails, aber diese SO question bietet möglicherweise einen Workaround, wenn Grails es unterstützt.

+0

danke, die Lösung dort arbeitete für mich. – peepsalot

Verwandte Themen