Невозможно получить идентификатор сеанса для "запомнить меня" пользователей в прослушивателе событий входа в систему безопасности spring - PullRequest
0 голосов
/ 28 декабря 2010

Я пишу веб-приложение с использованием 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, так же, как слушатель входа в систему, который срабатывает нормально.

Есть идеи, как правильно установить идентификатор сессии?

1 Ответ

2 голосов
/ 31 декабря 2010

Не относится к grails, но этот SO вопрос может предложить обходной путь, если grails его поддерживает.

...