Spring Security记住我不工作

时间:2014-01-29 08:49:15

标签: java spring spring-security

我花了一天时间,但不明白为什么SPring Security中的remember_me无效。我只使用xml作为配置,没有Java代码:

<http use-expressions="false" auto-config="true">
        <intercept-url pattern="/css/**" filters="none" />
        <intercept-url pattern="/**" access="ROLE_USER" />
        <form-login login-page="/BL/index.html" default-target-url="/BL/main.html"
            authentication-failure-url="/BL/index.html?autherror=true"
            always-use-default-target='true' />
        <logout logout-url="/logout" logout-success-url="/BL/index.html"
            invalidate-session="true" />
        <remember-me data-source-ref="dataSource"
            user-service-ref="jdbcUserService" key="99999989"
            token-validity-seconds="86400" />
        <access-denied-handler error-page="/BL/index.html?autherror=true" />
    </http>

简而言之index.html是我的登录页面。当我登录时,我看到名称SPRING_SECURITY_REMEMBER_ME_COOKIE创建的Cookie值为V2FrblE1Vlk3cFd6ZDIvZnRjdnlIZz09OndOb2h2NmUvdFlZRHJvRFRPV3lheHc9PQ

但如果我现在回到index.html页面,它会要求我再次登录。我仍然看到相同的cookie值。上面的xml配置中有什么错误?我希望它不应该让我再次登录,但应该重定向到我的主页,因为我已经登录。

我在下面登录服务器上看到了。看起来请求与用户一起发送为空字符串:

  

14:16:34,031 DEBUG JdbcUserDetailsManager:155 - 查询返回否   用户'14:16:34,031 DEBUG DaoAuthenticationProvider:131的结果 -   用户''未找到14:16:34,031 DEBUG   UsernamePasswordAuthenticationFilter:318 - 身份验证请求   失败:   org.springframework.security.authentication.BadCredentialsException:   证言不正确14:16:34,032 DEBUG   UsernamePasswordAuthenticationFilter:319 - 已更新   SecurityContextHolder包含null身份验证14:16:34,032   DEBUG UsernamePasswordAuthenticationFilter:320 - 委托给   验证失败   handlerorg.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler@6011c7cf   14:16:34,032 DEBUG PersistentTokenBasedRememberMeServices:214 -   交互式登录尝试失败。 14:16:34,032调试   PersistentTokenBasedRememberMeServices:300 - 取消cookie   14:16:34,032 DEBUG SimpleUrlAuthenticationFailureHandler:67 -   重定向到/BL/index.html?autherror=true

1 个答案:

答案 0 :(得分:6)

Spring不会阻止登录用户访问登录页面。

要测试RememberMe提供程序,您至少需要两个页面(使用不同的登录名)

  • 登录页面
  • 只有在用户登录后才能访问的普通页面。

用户拥有此cookie后,您可以关闭浏览器,再次打开浏览器,然后直接访问受保护的页面(不应将用户重定向或转发到登录页面)

但是您的日志声明显示,您尝试通过登录页面登录用户,另一方面您告诉您要使用记住我令牌。 - 要使用“记住我”Cookie,您不能请求登录页面,而是请求一些正常页面。

RememberMeAuthenticationFilter将(在尝试登录时)在DEBUG级别打印此消息:

  • “SecurityContextHolder填充了remember-me令牌:......”(成功)
  • “SecurityContextHolder未填充记住我的令牌,因为AuthenticationManager拒绝了由RememberMeServices返回的身份验证...”(失败)