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?
danke, die Lösung dort arbeitete für mich. – peepsalot