【发布时间】:2012-03-13 03:35:48
【问题描述】:
问题来了:
我们必须实现两步登录过程。第一步 - 用户输入名称/密码并进行身份验证。第二步 - 用户可能会看到辅助选择屏幕,他通过简单的点击选择一个选项。完成此操作后,用户最终被授权执行某些操作。当前用户会话的身份验证/授权过程到此结束。
我们确实以标准形式使用 Spring Security:默认情况下 Spring Security 堆栈处理第一个登录屏幕,一旦用户进入 - Spring 认为登录过程已完成。
辅助选择屏幕完全在 Spring Security 之外,我们在用户选择时所做的只是将正确配置的对象设置回安全上下文。正如预期的那样,这适用于当前会话。
我们也有记住我的功能,它是通过第一个登录屏幕中名为 _spring_security_remember_me 的复选框以及被覆盖的 UserDetailsService bean 实现的。
只要没有辅助选择屏幕选项,remember-me 就可以正常工作。由于二级屏幕与 Spring Security 无关,因此不会为二级选项激活记住我机制,它所能做的就是只记住第一个登录步骤。这导致必须向记住的用户询问选项,我们的任务是避免这种情况。
在同一页面上同时拥有登录表单和辅助选择不是一种选择。
如果需要辅助选择,我们可以使用额外的 cookie,并且在验证时基于该 cookie“静默”传递所需的参数。但这意味着我们必须做一些 Spring Security“应该”提供的手动工作,这也将一些安全逻辑和令牌置于 Spring 管理的安全性和记住我的功能之外。
所以这里是安全专家的问题:如何“强制”记住我的功能来接受第二个提供的选项?如果 Remember-Me 过滤器可以“检查”传递的 URL 并确定选择了 remember-me 选项,我们可以添加此参数。但这听起来不太可能。
在辅助屏幕上使用另一个登录表单并“静默”传递所需的附加参数是否可能/可行?我知道在这种情况下我们不会包含用户名/密码,至少不是以明确的形式。这个选项听起来像是可以完成的,但我仍然相信可能有一种更简单的方法来强制记住我做它所做的事情。或者有吗?
谢谢, 尼古拉
【问题讨论】:
标签: spring-security remember-me