SpringSecurity-记住我-第六章

SpringSecurity-记住我
一.概念及思路

  1. 什么是记住我
    Remember me(记住我)记住我,当用户发起登录勾选了记住我,在一定的时间内再次登录就不用输入用户名和密码了,即使浏览器退出重新打开也是如此。

  2. 流程分析
    在SpringSecurity中提供RememberMeAuthenticationFilter过滤器来实现记住我功能,其核心流程如下:
    在这里插入图片描述

①认证成功UsernamePasswordAuthenticationFilter会调用RememberMeServices创建Token
(见其父类AbstractAuthenticationProcessingFilter.successfulAuthentication),同时 RemeberMeService 会调用TokenRepository将Token写入数据库(persistent_logins),然后 RemeberMeService通 过Reponse.addCookie把Token写到浏览器的Cookies中

②当浏览器再次发起请求会进入RemeberMeAuthenticationFilter,该Filter获取到请求cookies中的token交给RemeberMeService

③RemeberMeService调用TokenRepository去数据库中根据Token查询用户名

④调用UserDetilasService.loadUserByUsername根据用户名获取用户认证信息

⑤通过authenticationManager.authenticate,做一次认证,然后把用户信息放入上下文对象中SecurityContext

二.编码实战

  1. 修改该登录页
<div class="checkbox">
<label><input type="checkbox" id="rememberme" name="remember-me"/>记住我</label>
</div>

增加记住我的选择框,注意name一定是”remember-me”

2.配置TokenRepository

PersistentTokenRepository是指明token的持久化方案(即用来存储“记住我”相关信息)。remember me功能是基于token,持久化方案有两种,一种基于内存,使用的是InMemoryTokenRepositoryImpl,一种基于数据库,使用的是JdbcTokenRepositoryImpl。这里我选择基于数据库的方式。

@Autowired
private DataSource dataSource ;

@Bean
public PersistentTokenRepository persistentTokenRepository(){
     JdbcTokenRepositoryImpl obj = new JdbcTokenRepositoryImpl();
     obj.setDataSource(dataSource);
     obj.setCreateTableOnStartup(true);	
     //启动创建表persistent_logs表,存token,username时会用到
     return obj;
}

配置持久化方案,用来存储“记住我”相关信息到数据库
如果:设置了“ obj.createTableOnStartUp(true);”之后会自动创建表persistent_logs,就不用再手动创建表。

  1. 配置rememberMe

修改认证服务配置WebSecurityConfig的 HttpSecurity配置,增加rememberMe

	@Autowired
	private UserDetailsService userDetailsService;
http.rememberMe()
    .tokenRepository(persistentTokenRepository())	//持久
    .tokenValiditySeconds(3600)	//过期时间
    .userDetailsService(userDetailsService); //用来加载用户认证信息的

注意:UserDetailsService 注入在方法体外面;http.rememberMe()在方法体里面

@Autowired
	private UserDetailsService userDetailsService;
  1. 创建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;

5.测试
①访问登录页面进行登录,勾选记住我
②登录成功后,退出浏览器
③重新打开浏览器,直接访问资源-不需要登录就能访问

6.登录前后cookie对比
在这里插入图片描述

登录前
在这里插入图片描述
登录后
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值