计算机系统应用教程网站

网站首页 > 技术文章 正文

Spring Security记住我功能实现及源码分析

btikc 2024-09-29 09:56:30 技术文章 16 ℃ 0 评论

环境:Spring Boot 2.2.11.RELEASE


请先阅读《Spring Boot Security防重登录及在线总数 》,《Springboot Security 基础应用 (1)

相关配置

  • Security配置
@Resource
private DataSource dataSource ;

// 这里配置持久化登录token
@Bean
public PersistentTokenRepository persistentTokenRepository() {
	JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
  tokenRepository.setDataSource(dataSource) ;
  return tokenRepository;
}
  • SQL脚本

进入JdbcTokenRepositoryImpl中将其中的CREATE_TABLE_SQL语句复制出来执行下。

  • HttpSecurity配置
http.rememberMe()
			.tokenRepository(persistentTokenRepository())
			.userDetailsService(userDetailsService()) // 记住我功能有效期内,用来查询用户详细信息的UserDetailsService
			.tokenValiditySeconds(1800) ; // token有效期
  • 登录页面
<div class="c-row" style="height: auto;">
  <input type="checkbox" class="checkbox-control" id="remember-me" name="remember-me"/><label for="remember-me">记住我</label>
</div>

注意这里的checkbox的name属性值必须是“remember-me”。
这样就可以实现记住我功能了。只要在token有效期内,每次打开页面都不需要重新登录了。

  • 测试

登录后,关闭浏览器重写再打开页面不需要重新登录,同时查看数据表如下:

源码分析

我们从第一次登录开始

1.1 首先进入的UsernamePasswordAuthenticationFilter过滤器,进入父类(AbstractAuthenticationProcessingFilter)的doFilter方法中。

直接进入登录成功的方法

1.2 执行successfulAuthentication方法

successfulAuthentication(request, response, chain, authResult);

1.3 进入loginSuccess方法

进入AbstractRememberMeServices类中的loginSuccess方法

1.4 执行子类PersistentTokenBasedRememberMeServices中的onLoginSuccess方法。

这里的tokenRepository就是我们上面配置的

接着我们看再次打开浏览器后是如何实现免登录的。

1.1 首先执行RememberMeAuthenticationFilter的doFilter方法

这个过滤器是只有你开启了记住我功能才会生效的。

从当前Security上下文中获取对象,获取不到通过remeberMeService自动登录

1.2 执行AbstractRememberMeServices中的autoLogin方法

执行extractRememberMeCookie方法获取cookie中的remember-me信息

1.3 执行processAutoLoginCookie方法

这里解析出来的信息已经和数据库中对应上了。这样就可以拿到username了。

1.4 接下来执行一些判断token是否过期和更新token有效期

1.5 根据查询出来的username查询用户信息

return getUserDetailsService().loadUserByUsername(token.getUsername());

1.6 最后将用户信息存储到Security的上下文中

完毕!!!

给给个关注+转发呗谢谢

Spring Cloud Sentinel 熔断降级

Spring Cloud Sentinel 流控限流

SpringBoot整合RocketMQ入门示例

SpringMVC参数统一验证方法

springboot中定时任务执行Quartz的使用

Spring MVC 异步请求方式

Spring MVC 异常处理方式

Springboot Security 基础应用 (1)

SpringCloud Nacos 服务消费者

Spring Cloud Sentinel整合Feign

Java加密与解密之非对称加密RSA

分布式事务框架Seata之AT模式

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表