【问题标题】:How does Remember Me work in Spring Security?记住我如何在 Spring Security 中工作?
【发布时间】:2011-03-09 17:38:10
【问题描述】:

我很好奇记住我是如何工作的以及它在 Spring Security 中是如何工作的?

我了解服务器会向客户端发送长期有效的 cookie。然后客户端发回cookie,服务器可以识别客户端,因为服务器上有类似hash-map的东西与cookie --> session的关系。

我不明白服务器 [Tomcat] 重新启动后,服务器 [服务器端应用程序] 如何通过 cookie 识别客户端。

Spring Security 在服务器关闭之前如何以及在哪里保存cookie-session 映射?它是否特定于服务器(即在 Tomcat、Jetty 等中发生了不同的事情)?

附:另一个与 Spring Security 和重新部署相关的问题:即使我没有勾选 RememberMe 并登录,在重新部署大约 3 分钟后我仍然会被识别。它可以修复吗?

【问题讨论】:

    标签: java tomcat spring-security remember-me


    【解决方案1】:

    The Spring Security docs discuss 这实际上是如何工作的。

    这种方法使用散列来实现有用的记住我的策略。本质上,在交互式身份验证成功后会向浏览器发送一个 cookie,该 cookie 的组成如下:

    base64(username + ":" + expirationTime + ":" + md5Hex(username + ":" + expirationTime + ":" password + ":" + key))

    ...

    因此,remember-me 令牌仅在指定的期限内有效,并且用户名、密码和密钥不会更改。值得注意的是,这有一个潜在的安全问题,即在令牌过期之前,任何用户代理都可以使用捕获的记住我令牌。这与摘要式身份验证的问题相同。

    基本上,cookie 包含用户名、密码、过期时间和密钥(您指定),所有这些都是hashed 一起。当您的浏览器将此 cookie 的内容发送到服务器时,Spring Security:

    1. 从后端检索给定用户名的密码
    2. 从数据库中计算用户名/密码/等的md5Hex(),并将其与cookie中的值进行比较
    3. 如果它们匹配 - 您已登录!如果不匹配,则您提供了伪造的 cookie 或用户名/密码/密钥之一已更改。

    这里的基本假设是哈希函数 - 上面的 md5Hex() 部分 - 提供了一种在一个方向上轻松编码某些数据的方法,但反转非常困难且不切实际(从 @987654326 恢复密码@文本)。

    【讨论】:

      【解决方案2】:

      不要将会话 cookie 与记住我的 cookie 混淆。

      会话 cookie 由服务器(例如 Tomcat)发送,用于将传入请求与会话相关联。

      Remember Me cookie 由 Spring Security 发送,用于在不同会话中对客户端进行身份验证(例如,在原始会话到期后或服务器重启后)。

      通过 Remember Me cookie 对用户进行身份验证 Spring Security 提供了 2 种策略:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-10
        • 2012-01-03
        • 2018-09-23
        • 2018-12-02
        • 2012-01-21
        • 2012-03-06
        • 2014-09-04
        • 1970-01-01
        相关资源
        最近更新 更多