以下是问题所在:
我们必须实现两步登录过程。第一步-用户输入名称/密码并进行身份验证。第二步骤-用户可以被呈现第二选择屏幕,其中他通过简单的点击来选择选项。完成此操作后,用户最终将被授权执行某些操作。这将结束当前用户会话的身份验证/授权过程。
我们确实使用了Spring Security的标准形式:默认情况下,第一个登录屏幕是由Spring Security堆栈处理的,一旦用户进入,Spring就认为登录过程已经完成。
辅助选择屏幕完全在Spring Security之外,我们在用户选择时所做的就是将正确配置的对象设置回安全上下文中。这适用于当前会话,正如预期的那样。
我们也有remember-me功能,它是通过在第一个登录屏幕中名为_spring_security_remember_me的复选框和一个被覆盖的UserDetailsService bean实现的。
只要没有第二个选择屏幕选项,remember-me就可以正常工作。由于第二个屏幕与Spring Security无关,因此不会为第二个选项激活记住我的机制,它所能做的就是只记住第一个登录步骤。这导致必须询问记忆中的用户该选项,我们的任务是避免这种情况。
在同一页上同时具有登录表单和辅助选择不是一个选项。
如果需要第二次选择,我们可以使用额外的cookie,并基于该cookie在身份验证时“静默”传递所需的参数。但这意味着我们必须做一堆Spring Security“应该”提供的手动操作,这也将一些安全逻辑和令牌放在Spring托管安全和remember-me功能之外。
因此,这里是安全专家的问题:如何“强制”记住我的功能接受第二个呈现的选项?如果Remember-Me过滤器可以“检查”传递的URL并确定选择了remember-me选项,我们可以添加此参数。但这听起来似乎是不可能的。
在辅助屏幕上使用另一个登录表单并“静默”传递所需的附加参数是否可能/可行?我知道我们不会在这种情况下包含用户名/密码,至少不会以清晰的形式包含。这个选项听起来似乎是可以做到的,但我仍然相信,可能有一种更简单的方法来迫使Remember Me去做它所做的事情。还是真的有?
谢谢,尼古拉
发布于 2012-03-04 22:20:05
您可以将每个用户最后选择的选项存储在数据库中。然后实现一个AuthenticationSuccessHandler,它从数据库读取存储的选项,并在安全上下文中设置它。如果未找到该选项,则将用户重定向到选择屏幕。
在Spring论坛上有一个discussion on this topic。
https://stackoverflow.com/questions/9401047
复制相似问题