Запомнить меня процесс декодирования файлов 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.

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


person Saurabh Kumar    schedule 08.02.2013    source источник
comment
Похоже, что PersistentTokenBasedRememberMeService всегда создает новый токен, когда пользователь входит в систему через файл cookie. Таким образом, для 2. и 3. входа в систему должны быть разные значения файлов cookie. - Убедитесь, что ваш браузер отправляет разные значения файлов cookie.   -  person Ralph    schedule 08.02.2013
comment
Я проверил, что браузер каждый раз отправляет один и тот же файл cookie. SPRING_SECURITY_REMEMBER_ME_COOKIE был MWJ0cmc0SGxFelJzcStXUmhsaVhtUT09OjI0cWlVcHk1Q2QrWVJTb2hKZU1BNmc9PQ. Я проверил с помощью firebug.   -  person Saurabh Kumar    schedule 08.02.2013
comment
Я проверяю тот же файл cookie, следующая строка String cookieAsPlainText = new String(Base64.decode(cookieValue.getBytes())); создает разные значения. Это странно... . Эта строка находится в методе org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices.decodeCookie(String).   -  person Saurabh Kumar    schedule 08.02.2013
comment
Согласны ли вы с тем, что PersistentTokenBasedRememberMeServices строки 120 и 121 создают новый токен после каждого успешного входа в систему? tokenRepository.updateToken(newToken.getSeries(), newToken.getTokenValue(), newToken.getDate()); addCookie(newToken, request, response); - поставьте точку клюва на этой линии и посмотрите, что получится   -  person Ralph    schedule 08.02.2013
comment
Упс !!!!На самом деле я ошибся, внимательно глядя. Три этапа печенья являются bDc0TzR2QnRXdFhhbXNQTlR6ZHRLQT09OkFWbUNqcDkxczQyNnJQUjZvKzNIOXc9PQ bDc0TzR2QnRXdFhhbXNQTlR6ZHRLQT09OkFWbUNqcDkxczQyNnJQUjZvKzNIOXc9PQ bDc0TzR2QnRXdFhhbXNQTlR6ZHRLQT09Om9zZ3FoRWpLeDRrUHhDTlFsTmVoUkE9PQ последнее печенье отличается от первых двух. Как я могу получить тот же файл cookie или справиться с этим на весенней стороне.   -  person Saurabh Kumar    schedule 08.02.2013
comment
Возникает ли та же проблема, если у вас НИКОГДА нет двух экземпляров браузера одновременно?   -  person Ralph    schedule 08.02.2013
comment
Хорошо, проблема решена. Спасибо, Ральф. Ваша точка зрения относительно токена обновления была очень хорошей, потому что я видел, что обновление не работает должным образом. Теперь я исправил ошибку. Большое спасибо.   -  person Saurabh Kumar    schedule 08.02.2013


Ответы (1)


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

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

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

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

person jasop    schedule 06.03.2013