上一篇文章中我们对SpringSecurity图片验证码。
我们在访问很多网站的时候,会看到很长一段时间可以不用登录,那这个功能其实就是记住我功能,这篇文章将使用SpringSecurity做到记住我功能,并且告知大家其中的原理,让大家即使不通过SpringSecurity也能够自己实现记住我功能。
1.原理
1.1UsernamePasswordAuthenticationFilter接受到认证请求
当认证成功后,会调用一个叫做RemeberMeService的服务,这个是SpringSecurity提供的服务,它主要做两件事情,生成一个Token,然后分别写入数据库和Cookie中去,如下图代码所示:
1.2第二次服务请求
此时是有RememberMeAuthenticationFilter来处理该请求,Filter会读取Cookie中的Token,然后继续由RemeberMeService的TokenRepository来查找数据库中的相关信息,如果查询到了,此时会调用UserDetailsService来获取用户信息。RememberMeAuthenticationFilter所处的位置是在倒数第二个Filter的位置。只要前面的Filter过滤掉了,都会经过它来判断是否需要免密登录。
2.实战
2.1增加记住我功能的时间
设置为1小时
2.2增加配置
添加一个存储token的repository,设置token的失效时间
2.3添加repositoryBean
@Bean
public PersistentTokenRepository persistentTokenRepository() {
JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
tokenRepository.setDataSource(dataSource);
tokenRepository.setCreateTableOnStartup(true);
return tokenRepository;
}
这个Bean会被2.2使用到,而且还会在数据库中生成persistent_logins表,用于登录成功后的信息记录
2.4测试
第一次登录成功后,数据表中会添加信息
此时我们重启应用,直接访问user,会看到不用输入密码也能得到结果
记住我功能Get了吗~~