【问题标题】:Remember-me functionality for Spring SecuritySpring Security 的记住我功能
【发布时间】:2012-03-13 03:35:48
【问题描述】:

问题来了:

我们必须实现两步登录过程。第一步 - 用户输入名称/密码并进行身份验证。第二步 - 用户可能会看到辅助选择屏幕,他通过简单的点击选择一个选项。完成此操作后,用户最终被授权执行某些操作。当前用户会话的身份验证/授权过程到此结束。

我们确实以标准形式使用 Spring Security:默认情况下 Spring Security 堆栈处理第一个登录屏幕,一旦用户进入 - Spring 认为登录过程已完成。

辅助选择屏幕完全在 Spring Security 之外,我们在用户选择时所做的只是将正确配置的对象设置回安全上下文。正如预期的那样,这适用于当前会话。

我们也有记住我的功能,它是通过第一个登录屏幕中名为 _spring_security_remember_me 的复选框以及被覆盖的 UserDetailsS​​ervice bean 实现的。

只要没有辅助选择屏幕选项,remember-me 就可以正常工作。由于二级屏幕与 Spring Security 无关,因此不会为二级选项激活记住我机制,它所能做的就是只记住第一个登录步骤。这导致必须向记住的用户询问选项,我们的任务是避免这种情况。

在同一页面上同时拥有登录表单和辅助选择不是一种选择。

如果需要辅助选择,我们可以使用额外的 cookie,并且在验证时基于该 cookie“静默”传递所需的参数。但这意味着我们必须做一些 Spring Security“应该”提供的手动工作,这也将一些安全逻辑和令牌置于 Spring 管理的安全性和记住我的功能之外。

所以这里是安全专家的问题:如何“强制”记住我的功能来接受第二个提供的选项?如果 Remember-Me 过滤器可以“检查”传递的 URL 并确定选择了 remember-me 选项,我们可以添加此参数。但这听起来不太可能。

在辅助屏幕上使用另一个登录表单并“静默”传递所需的附加参数是否可能/可行?我知道在这种情况下我们不会包含用户名/密码,至少不是以明确的形式。这个选项听起来像是可以完成的,但我仍然相信可能有一种更简单的方法来强制记住我做它所做的事情。或者有吗?

谢谢, 尼古拉

【问题讨论】:

    标签: spring-security remember-me


    【解决方案1】:

    您可以将每个用户最后选择的选项存储在数据库中。然后您实现一个AuthenticationSuccessHandler,它从数据库中读取存储的选项并将其设置在安全上下文中。如果未找到该选项,则将用户重定向到选择屏幕。

    仅当您使用 Spring Security 3.1 或更高版本时,无论身份验证类型如何(表单、基本或记忆),这都应该有效,因为已经引入了注册 AuthenticationSuccessHandler 的可能性in that version。在 Spring 论坛中有一个 discussion on this topic

    【讨论】:

    • 感谢您的建议,但它看起来比我们的数据库设计更复杂。我通过在登录本身中嵌入用户名和额外参数来实现这一点,因此 RememberMe 已经将所有值包含在单个令牌中 - 这就是目标。挑战在于找出真正触发内置登录的“第二个”登录表单。第二个登录表单实际上只有隐藏参数并且由 JavaScript 操作(即用户没有得到 hi 再次登录的线索 - 他只是选择了那个附加值)。
    • 我不明白为什么您需要将提交第二个屏幕视为实际登录。 “登录”与经过身份验证的用户建立可信会话。其他一切实际上是用户会话的属性,而不是身份验证上下文。您不能将第二个选择视为持久的简单用户配置值吗?此外,我无法遵循您的假设,即这会使您的数据库设计复杂化:它是一个包含三列的简单表:用户名、键和值。
    猜你喜欢
    • 1970-01-01
    • 2014-07-23
    • 2019-07-26
    • 2014-08-02
    • 2015-05-10
    • 2012-01-21
    • 2018-12-02
    • 2014-09-04
    • 1970-01-01
    相关资源
    最近更新 更多