文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring Security功能实现及源码分析

2024-12-03 05:58

关注

环境:Spring Boot 2.2.11.RELEASE

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

相关配置

  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; 

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

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

 登录页面

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

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

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

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

源码分析

我们从第一次登录开始

1 首先进入的

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

直接进入登录成功的方法

2 执行successfulAuthentication方法

  1. successfulAuthentication(request, response, chain, authResult); 

 

3 进入loginSuccess方法

进入

AbstractRememberMeServices类中的loginSuccess方法

4 执行子类

PersistentTokenBasedRememberMeServices中的onLoginSuccess方法。

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

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

1 首先执行

RememberMeAuthenticationFilter的doFilter方法

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

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

2 执行

AbstractRememberMeServices中的autoLogin方法

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

3 执行processAutoLoginCookie方法

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

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

验证是否过期

更新token有效期

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

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

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

完毕!!!

 

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯