SpringSecurity功能实现及源码分析

环境:Spring Boot 2.2.11.RELEASE

创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于成都做网站、网站设计、宁武网络推广、微信小程序定制开发、宁武网络营销、宁武企业策划、宁武品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联公司为所有大学生创业者提供宁武建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com

请先阅读《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.  
  2.   记住我 
 

 注意这里的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的上下文中

完毕!!!

网页标题:SpringSecurity功能实现及源码分析
本文路径:http://www.shufengxianlan.com/qtweb/news17/13917.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

猜你还喜欢下面的内容

手机网站建设知识

各行业网站