Spring Security功能实现及源码分析

开发 前端
本篇给大家介绍Spring Security功能实现及源码分析的相关知识,希望能够帮助到你!

[[396412]]

环境:Spring Boot 2.2.11.RELEASE

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

相关配置

  • Security配置
  1. @Resource 
  2. private DataSource dataSource ; 
  3.  
  4. // 这里配置持久化登录token 
  5. @Bean 
  6. public PersistentTokenRepository persistentTokenRepository() { 
  7.     JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl(); 
  8.   tokenRepository.setDataSource(dataSource) ; 
  9.   return tokenRepository; 
  •  SQL脚本

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

  • HttpSecurity配置
  1. http.rememberMe() 
  2.             .tokenRepository(persistentTokenRepository()) 
  3.             .userDetailsService(userDetailsService()) // 记住我功能有效期内,用来查询用户详细信息的UserDetailsService 
  4.             .tokenValiditySeconds(1800) ; // token有效期 

 登录页面

  1. <div class="c-row" style="height: auto;"
  2.   <input type="checkbox" class="checkbox-control" id="remember-me" name="remember-me"/><label for="remember-me">记住我</label> 
  3. </div> 

 注意这里的checkbox的name属性值必须是“remember-me”。

这样就可以实现记住我功能了。只要在token有效期内,每次打开页面都不需要重新登录了。

  • 测试

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

源码分析

我们从第一次登录开始

1.1 首先进入的

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

直接进入登录成功的方法

1.2 执行successfulAuthentication方法

  1. 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查询用户信息

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

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

完毕!!!

 

责任编辑:姜华 来源: 今日头条
相关推荐

2021-06-07 14:06:19

Spring SecuCSRF防御

2022-06-16 10:38:24

URL权限源代码

2024-01-05 08:38:20

SpringBeanScope

2022-03-07 10:05:02

SpringStreamMQ连接

2024-01-29 08:28:01

Spring事务失效

2021-08-09 11:15:28

MybatisJavaSpring

2014-12-11 13:37:13

WPF架构

2023-11-09 09:08:38

RibbonSpring

2021-04-26 08:54:17

Spring BootSecurity防重登录

2021-08-05 10:40:37

加密方案Spring

2021-12-28 11:13:05

安全认证 Spring Boot

2021-07-03 15:22:02

Mybatis InsID源码

2012-02-23 12:53:40

JavaPlay Framew

2021-04-23 07:33:10

SpringSecurity单元

2023-01-10 07:52:15

2021-08-29 18:36:57

项目

2023-08-26 19:04:40

配置write转换器

2011-04-26 09:33:04

SpringAOP

2020-10-09 14:13:04

Zookeeper Z

2019-09-09 06:30:06

Springboot程序员开发
点赞
收藏

51CTO技术栈公众号