Spring Security性能实现及源码分析

相关配置

  • 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就是我们上面配置的

 

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

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章