记住Spring Security的功能

时间:2012-02-22 18:47:30

标签: spring-security remember-me

问题在于:

我们必须实施两步登录流程。第一步 - 用户输入名称/密码并进行身份验证。第二步 - 可以向用户呈现次要选择屏幕,其中他通过简单的点击选择选项。完成此操作后,最终会授权用户执行某些操作。这结束了当前用户会话的身份验证/授权过程。

我们以标准形式使用Spring Security:第一个登录屏幕由默认的Spring Security堆栈处理,一旦用户进入,Spring就会认为登录过程已经完成。

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

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

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

同一页面上的登录表单和辅助选择都不是一个选项。

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

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

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

谢谢, 尼古拉

1 个答案:

答案 0 :(得分:0)

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

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