Spring Security记住我功能实现及源码分析相关配置
  • Security配置



@Resource
private DataSource dataSource ;

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


  • SQL脚本

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


Spring Boot Security记住我源码分析_spring security

 


  • 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有效期内,每次打开页面都不需要重新登录了。

  • 测试

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


Spring Boot Security记住我源码分析_springboot_02

 


源码分析

我们从第一次登录开始

1.1 首先进入的

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


Spring Boot Security记住我源码分析_spring_03

 


直接进入登录成功的方法

1.2 执行successfulAuthentication方法

successfulAuthentication(request, response, chain, authResult);


Spring Boot Security记住我源码分析_spring security_04

 


1.3 进入loginSuccess方法

进入

AbstractRememberMeServices类中的loginSuccess方法


Spring Boot Security记住我源码分析_spring security_05

 


1.4 执行子类

PersistentTokenBasedRememberMeServices中的onLoginSuccess方法。


Spring Boot Security记住我源码分析_用户信息_06

 


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


Spring Boot Security记住我源码分析_源码分析_07

 


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

1.1 首先执行

RememberMeAuthenticationFilter的doFilter方法

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


Spring Boot Security记住我源码分析_用户信息_08

 


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

1.2 执行

AbstractRememberMeServices中的autoLogin方法


Spring Boot Security记住我源码分析_spring_09

 


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


Spring Boot Security记住我源码分析_源码分析_10

 


Spring Boot Security记住我源码分析_springboot_11

 


1.3 执行processAutoLoginCookie方法


Spring Boot Security记住我源码分析_spring_12

 


Spring Boot Security记住我源码分析_springboot_13

 


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

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


Spring Boot Security记住我源码分析_用户信息_14

验证是否过期


Spring Boot Security记住我源码分析_用户信息_15

更新token有效期


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


Spring Boot Security记住我源码分析_spring_16

 

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


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


Spring Boot Security记住我源码分析_springboot_17

 


完毕!!!

给给个关注+转发呗谢谢

完毕



Spring Boot Security记住我源码分析_spring security_18

Spring Boot Security记住我源码分析_源码分析_19

Spring Boot Security记住我源码分析_springboot_20

Spring Boot Security记住我源码分析_用户信息_21


 



Spring Boot Security记住我源码分析_spring security_18

Spring Boot Security记住我源码分析_源码分析_19

Spring Boot Security记住我源码分析_springboot_20

Spring Boot Security记住我源码分析_用户信息_21