我正在使用春天记住我的服务。我看到了一种奇怪的行为。
我正在采取的步骤:
使用用户名/密码登录我的网站并选中“记住我”复选框
比关闭浏览器并打开新浏览器并打开新浏览器。从技术上讲,我必须自动登录。这也正在发生。我正在使用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
但是Spring解码了(org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices.tokenRepository)
final String presentedSeries = cookieTokens[0];
final String presentedToken = cookieTokens[1];
在第一个请求中正确但在第二个请求它解码presentToken不同的东西导致cookie盗窃异常。
这是正确的行为吗?我该如何解决这个问题?
答案 0 :(得分:0)
我有同样的问题。 第一个请求是匹配令牌然后创建一个新令牌,但是在此之后第二个请求将立即到达(使用与第一个请求相同的令牌)并且令牌将不再匹配!
我无法理解为什么第二个请求在第一个请求之后直接进入。
最后,我的解决方案是继承PersistentTokenBasedRememberMeServices
并覆盖processAutoLoginCookie
方法。我只是检查了cookie盗窃异常的检查(这会产生一个安全漏洞,但是我的目的可以接受)。
如果您想要一个更安全的解决方案,您可以轻松添加逻辑以匹配最后两个呈现的令牌。