Spring Security 提供了Remember-me机制用来实现记录用户的登陆状态。方便用户下 html
次自动登陆。Spring Security 对此操做提供了必要的钩子,remember-me有两个固定的实现 java
一个是使用把用户登陆信息加密以cookie的方式保存到客户端。一是用户能够把用户信息 web
持久化到服务端的数据库中。 spring
注意:这两种实现都必须有一个 UserDetailsService实现。若是你使用一个没有使用 sql
UserDetailsService的验证提供者,Remember-me将不会工做,除非你在应用的上下文中 数据库
有一个UserDetailsService对象。 安全
1、基本的Hash保存到客户端的Cookie中。 服务器
直接在命名空间<http>中加入<remember-me />元素,就能够使用本方法。但要注意的 cookie
是在你的。此时系统会自动为你生成UserDetailsService对象(若是你在配置文件中定义了此 app
对象必须在<remember-me />使用user-service-ref指定)。本策略使用的为
此策略会在客户端生成一个名称为SPRING_SECURITY_REMEMBER_ME_COOKIE,值进
行加密后的Cookie。
2、持久化到服务器端的服务器中
若是想使用本策略,你须要在命名空间的配置中提供一个datasource引用:
数据库中还必须包含一个名为persistent_logins的表,表结构使用一下SQL语句建立(或者是等价的):
因为以上两种策略对应的实现类都的父类(org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices)实现了LogoutHandler接口。
在AbstractRememberMeServices类中的 logout(...)方法中清楚了Cookie。以下所示:
若是想在用户安全退出后不删除Cookie, 能够本身实现类,实现类能够继承org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices 或
org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices。在自定义类中只重写org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices
类中的logout(...)方法便可。(可是这样 就失去了安全退出的意义了。哈哈)