记住我或持续登录身份验证指的是能够在会话之间记住主体的身份的网站。这通常是通过向浏览器发送 cookie 来完成的,在将来的会话中检测到 cookie 并导致自动登录。Spring Security 为这些操作提供了必要的挂钩,并且具有两个具体的记住我实现。一种使用散列来保持基于 cookie 的令牌的安全性,另一种使用数据库或其他持久存储机制来存储生成的令牌。
请注意,这两种实现都需要 这种方法使用散列来实现有用的记忆策略。本质上,一个 cookie 在成功的交互式认证后被发送到浏览器,cookie 的组成如下: base64(username + ":" + expirationTime + ":" + md5Hex(username + ":" + expirationTime + ":" password + ":" + key)) username: As identifiable to the UserDetailsService password: That matches the one in the retrieved UserDetails expirationTime: The date and time when the remember-me token expires, expressed in milliseconds key: A private key to prevent modification of the remember-me token 因此,只要用户名、密码和密钥不改变,记住我令牌仅对指定的时间段有效。值得注意的是,这存在一个潜在的安全问题,因为捕获的记住我令牌在令牌到期之前可从任何用户代理使用。这是与摘要身份验证相同的问题。如果主体知道捕获了令牌,那么它们可以轻松地更改密码,并立即使所讨论的所有记住我令牌无效。如果需要更显著的安全性,则应该使用下一节中描述的方法。另外,记住我服务根本不应该使用。
如果你熟悉命名空间配置一章中讨论的主题,那么只需添加 <http> ... <remember-me key="myAppKey"/> </http>
此方法基于文章 http://jaspan.com/improved_persistent_login_cookie_best_practice 稍作修改 [16]。若要使用命名空间配置的这种方法,你将提供一个数据源引用: <http> ... <remember-me data-source-ref="someDataSource"/> </http>
数据库应该包含使用以下 SQL(或等效)创建的 create table persistent_logins (username varchar(64) not null, series varchar(64) primary key, token varchar(64) not null, last_used timestamp not null)
记住我与 Authentication autoLogin(HttpServletRequest request, HttpServletResponse response); void loginFail(HttpServletRequest request, HttpServletResponse response); void loginSuccess(HttpServletRequest request, HttpServletResponse response, Authentication successfulAuthentication);
请参考Javadoc,以便更全面地讨论这些方法的作用,不过请注意,在这个阶段
此实现支持在 小节 18.2, “简单的基于散列的令牌方法” 描述的更简单的方法。 应用程序上下文中需要启用记住我服务的 bean 如下: <bean id="rememberMeFilter" class= "org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter"> <property name="rememberMeServices" ref="rememberMeServices"/> <property name="authenticationManager" ref="theAuthenticationManager" /> </bean> <bean id="rememberMeServices" class= "org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices"> <property name="userDetailsService" ref="myUserDetailsService"/> <property name="key" value="springRocks"/> </bean> <bean id="rememberMeAuthenticationProvider" class= "org.springframework.security.authentication.RememberMeAuthenticationProvider"> <property name="key" value="springRocks"/> </bean>
不要忘记将
这个类可以以与
在 小节 18.3, “持久令牌方法” 中描述了数据库模式。 |