会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 Spring Security功能实现及源码分析!

Spring Security功能实现及源码分析

时间:2025-11-04 16:35:07 来源:益强数据堂 作者:IT科技类资讯 阅读:237次

环境: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有效期

验证是否过期

更新token有效期

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

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

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

完毕!!!

亿华云

(责任编辑:域名)

推荐内容
  • 电脑小白入门教程(联想电脑操作指南,帮助新手迅速上手)
  • 基于MyCat构建MySQL分布式集群
  • MySQL的锁到底有多少内容 ?再和腾讯大佬的技术面谈,我还是小看锁了!
  • JavaScript 异步编程指南 - 如何用异步任务解决递归栈溢出?
  • 光驱安装XP系统教程(详细教你如何使用光驱安装XP系统)
  • MySQL的这个BUG,坑了多少人?