一.记住我概述
1.1.什么是记住我
Remember me(记住我)记住我,当用户发起登录勾选了记住我,在一定的时间内再次登录就不用输入用户名和密码了,即使浏览器退出重新打开也是如此。
1.2.流程分析
在SpringSecurity中提供RememberMeAuthenticationFilter过滤器来实现记住我功能,其核心流程如下:
1.认证成功UsernamePasswordAuthenticationFilter会调用RememberMeServices创建Token
(见其父类AbstractAuthenticationProcessingFilter.successfulAuthentication),同时 RemeberMeService 会调用TokenRepository将Token写入数据库(persistent_logins),然后 RemeberMeService通 过Reponse.addCookie把Token写到浏览器的Cookies中
2.当浏览器再次发起请求会进入RemeberMeAuthenticationFilter,该Filter获取到请求中的token交给RemeberMeService
3.RemeberMeService调用TokenRepository去数据库中根据Token查询用户名
4.调用UserDetilasService.loadUserByUsername根据用户名获取用户认证信息
5.通过authenticationManager.authenticate,做一次认证,然后把用户信息放入上下文对象中
二.编码实战
2.1.修改该登录页
<div class="checkbox"> <label><input type="checkbox" id="rememberme" name="remember-me"/>记住我</label> </div>
增加记住我的选择框,注意name一定是”remember-me”
2.2.配置TokenRepository
PersistentTokenRepository是指明token的持久化方案(即用来存储“记住我”相关信息)。remember me功能是基于token,持久化方案有两种,一种基于内存,使用的是InMemoryTokenRepositoryImpl,一种基于数据库,使用的是JdbcTokenRepositoryImpl。这里我选择基于数据库的方式。
@Autowired private DataSource dataSource ; @Bean public PersistentTokenRepository persistentTokenRepository(){ JdbcTokenRepositoryImpl obj = new JdbcTokenRepositoryImpl(); obj.setDataSource(dataSource); //启动创建表persistent_logs表,存token,username时会用到 //如果token表不存在,使用下面语句可以初始化该表;若存在,请注释掉这条语句,否则会报错。 obj.setCreateTableOnStartup(true); return obj; }
配置持久化方案,用来存储“记住我”相关信息到数据库
如果:设置了“ obj.createTableOnStartUp(true);”之后会自动创建表persistent_logs,就不用再手动创建表。
2.3.配置rememberMe
修改认证服务配置WebSecurityConfig的 HttpSecurity配置,增加rememberMe
@Autowired private UserDetailsService userDetailsService; http.rememberMe() .tokenRepository(persistentTokenRepository()) //持久 .tokenValiditySeconds(3600) //过期时间 .userDetailsService(userDetailsService); //用来加载用户认证信息的
2.4.创建persistent_logins 的表
注意,如果设置了 createTableOnStartUp(true); 就不用再执行该SQL
CREATE TABLE persistent_logins ( username varchar(64) NOT NULL DEFAULT ‘’, 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;
2.5.测试
1.访问登录页面进行登录,勾选记住我
2.登录成功后,退出浏览器
3.重新打开浏览器,直接访问资源-不需要登录就能访问
转 : https://blog.csdn.net/qq_32115993/article/details/109217721
https://www.cnblogs.com/jiezao/p/13748549.html
https://www.cnblogs.com/fanqisoft/p/10630631.html
标签:me,obj,springboot,登录,Spring,persistent,token,记住 From: https://www.cnblogs.com/fps2tao/p/17579713.html