Я использую весенние сервисы «Запомнить меня». Я наблюдаю странное поведение.
Шаги, которые я предпринимаю:
войдите на мой сайт, используя имя пользователя / пароль и поставив галочку «запомнить меня»
чем я закрываю браузер и открываю новый браузер и открываю новый браузер. Технически я должен авторизоваться автоматически. Это тоже происходит. Я использую
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.
Это правильное поведение? Как я могу решить проблему?
PersistentTokenBasedRememberMeService
всегда создает новый токен, когда пользователь входит в систему через файл cookie. Таким образом, для 2. и 3. входа в систему должны быть разные значения файлов cookie. - Убедитесь, что ваш браузер отправляет разные значения файлов cookie. - person Ralph   schedule 08.02.2013PersistentTokenBasedRememberMeServices
строки 120 и 121 создают новый токен после каждого успешного входа в систему?tokenRepository.updateToken(newToken.getSeries(), newToken.getTokenValue(), newToken.getDate()); addCookie(newToken, request, response);
- поставьте точку клюва на этой линии и посмотрите, что получится - person Ralph   schedule 08.02.2013