Я пишу веб-приложение с использованием Grails и Spring-Security 3.0.3, которое требует от меня вести запись в базе данных всех успешных входов в систему, включая имя пользователя, время, ip и sessionId.
Я создал прослушиватель при входе в систему (groovy code):
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)
}
}
}
Это срабатывает, как и ожидалось, когда пользователь входит в систему, но когда кто-то возвращается на сайт как "помните"меня "пользователь, sessionId является нулевым.Это ожидаемое поведение?Разве сеанс не должен быть создан к моменту успешного входа в систему?
Я попытался обойти это, добавив отдельный прослушиватель SessionCreationEvent, который найдет самую последнюю запись входа в систему для базы данных для пользователя и обновит эту строку с правильнымsessionId, как только сеанс существует, но кажется, что это событие создания сеанса никогда не запускается, и я не могу понять, почему.
Слушатель создания сеанса выглядит следующим образом:
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)
}
}
}
}
И для него определен bean-компонент в моем файле resources.groovy, так же, как слушатель входа в систему, который срабатывает нормально.
Есть идеи, как правильно установить идентификатор сессии?