Запомнить меня процесс декодирования файлов cookie

Я пользуюсь услугами весна, помни меня Я вижу странное поведение.

Шаги, которые я предпринимаю:

  • войдите на мой сайт, используя имя пользователя / пароль и отметив флажок запомнить меня

  • чем я закрываю браузер и открываю новый браузер и открываю новый браузер. Технически я должен войти в систему автоматически. Это тоже происходит. я использую PersistentTokenBasedRememberMeServices,

  • Теперь я снова закрываю браузер и снова открываю новый браузер, и когда я пытаюсь получить доступ к своему веб-сайту, я получаю следующее исключение:

        SEVERE: Servlet.service() for servlet [appServlet] in context with path [/Spring-Security] threw exception org.springframework.security.web.authentication.rememberme.CookieTheftException: Invalid remember-me token (Series/token) mismatch. Implies previous cookie theft attack.
        at org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices.processAutoLoginCookie(PersistentTokenBasedRememberMeServices.java:102)
        at org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices.autoLogin(AbstractRememberMeServices.java:115)
        at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:97)
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
        at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
        at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
    

    Я просверлил больше и увидел, что для моих последних двух запросов запомнился токен SPRING_SECURITY_REMEMBER_ME_COOKIE значение было

    bUpwUUJ3dGpUcVJjaGpIYXJxcmFkdz09OlBBRlZXbDVnYmZZQjM2RmFYVDNVMXc9PQ

но весной декодировал (org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices.tokenRepository)

    final String presentedSeries = cookieTokens[0];
    final String presentedToken = cookieTokens[1];

правильно в первом запросе, но во втором запросе он декодировал представил что-то другое, что привело к исключению кражи cookie.

Это правильное поведение? Как я могу решить проблему?

1 ответ

У меня была такая же проблема. Первый запрос соответствовал токену, а затем создавался новый токен, однако сразу после этого приходил второй запрос (с тем же токеном, что и первый запрос), и токены больше не совпадали!

Я не мог понять, почему второй запрос поступил сразу после первого.

В конце концов, мое решение было подкласс PersistentTokenBasedRememberMeServices и преодолеть processAutoLoginCookie метод. Я просто закомментировал проверку на исключение кражи cookie (это создает дыру в безопасности, однако это было приемлемо для моих целей).

Если вы хотите более безопасное решение, вы можете легко добавить логику для сопоставления на двух последних представленных токенах.

Другие вопросы по тегам