Version: Next
RememberMe记住我功能
最简实现
- Spring Security配置类
- 紧跟
http
对象写 - 跟后面的设置之间用
and()
隔开
- 紧跟
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.rememberMe(); //实现记住我自动登录配置,核心的代码只有这一行
}
}
...
http.rememberMe().and().csrf().disable()
...
- 前端登录表单添加一个CheckBox
name
属性值必须为remember-me
(有方法对他进行更改)
<form action="/login" method="post">
<span>用户名称</span><input type="text" name="username" id="username"/> <br>
<span>用户密码</span><input type="password" name="password" id="password" /> <br>
<!-- <input type="button" onclick="login()" value="登陆">-->
<label><input type="checkbox" name="remember-me"/>记住我</label>
<input type="submit" value="登陆">
</form>
JQuery Ajax请求模式下,需要用id获取这个CheckBox,然后使用
.is(":checked")
获取单选框的值使用Ajax请求时data域携带这个参数,参数名必须为
remember-me
function login() {
var username = $("#username").val();
var password = $("#password").val();
var rememberMe = $('#rememberMe').is(":checked");
if (username === "" || password === "") {
alert('用户名或密码不能为空');
return;
}
$.ajax({
type: "POST",
url: "/login",
data: {
"username": username,
"password": password,
"remember-me": rememberMe
},
success: function (json) {
if (json.isok) {
// json.href = '/index';
window.location.href = json.data
} else {
alert(json.message)
}
},
error: function (e) {
console.log(e.responseText);
}
});
}
实现原理
- 当我们登陆的时候,除了用户名、密码,我们还可以勾选remember-me。
- 如果我们勾选了remember-me,当我们登录成功之后服务端会生成一个Cookie返回给浏览器,这个Cookie的名字默认是remember-me;值是一个token令牌。
- 当我们在有效期内再次访问应用时,经过RememberMeAuthenticationFilter,读取Cookie中的token进行验证。验正通过不需要再次登录就可以进行应用访问。
RememberMe Token的组成
RememberMeToken = username, expiryTime, signatureValue
的Base64加密
- 用户名
- 过期时间
- 数字签名:用4个东西通过MD5生成
- 用户名
- 过期时间
- 密码
- 随机预定义key
Spring Security过滤器链
个性化配置
.rememberMe()
.rememberMeParameter("remember-me-new")
.rememberMeCookieName("remember-me-cookie")
.tokenValiditySeconds(2 * 24 * 60 * 60);
tokenValiditySeconds
用于设置token的有效期
,即多长时间内可以免除重复登录,单位是秒。不修改配置情况下默认是2周- 通过
rememberMeParameter
设置from表单“自动登录”勾选框的参数名称。如果这里改了,from表单
中checkbox的name属性要对应的更改。如果不设置默认是remember-me rememberMeCookieName
设置了保存在浏览器端的cookie
的名称,如果不设置默认也是remember-me。如下图中查看浏览器的cookie
Token数据库存储
建表
建一张RememberME Token的表
CREATE TABLE `persistent_logins` (
`username` varchar(64) NOT NULL,
`series` varchar(64) NOT NULL,
`token` varchar(64) NOT NULL,
`last_used` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`series`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
PersistentTokenRepository
初始化一个PersistentTokenRepository类型的Spring bean,并将系统使用的DataSource注入到该bean中
- 配置类
@Autowired
private DataSource dataSource;
@Bean
public PersistentTokenRepository persistentTokenRepository(){
JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
tokenRepository.setDataSource(dataSource);
return tokenRepository;
}
.rememberMe()
.tokenRepository(persistentTokenRepository())