014 Security的认证流程源码级详解
一:任务
1.任务
认证处理流程说明
认证结果如何在多个请求之间共享
获取认证用户信息
二:认证处理流程处理说明
1.流程图
这里只是一个登陆到登陆的认证部分的流程图。

2.流程解释
3.断点跟踪
页面登录,进入这里。
通过username与password得到一个UsernamePasswordAuthenticationToken。

看看这个UsernameOasswordAuthenticationToken对象的类图。

这里全是类,然后我们看到父类AbstractAuthenticationToken是Authentication的实现类,
其中,Authentication是封装了登录信息。

我们,进入这个方法。
先说明setAuthenticationed(false)的意思:上面的是否已经通过验证,在这里肯定是写false了。

关于super这里,我们可以看看父类的做法:

开始到setDeatils。

再到getAuthenticationManager
本身不包括认证判断逻辑,作用是管理AuthenticationProvider。当然要将带有验证信息的authRequest带入。
这里进入ProviderManager.class类中的authticate方法。
这里有一个for循环,因为登录方式不同。support在验证provider是否支持当前的登录方式。

如上图所说,如果通过验证,然后进入result = provider.authenticate(authentication);,进行真正的校验。
这个时候,我们使用的provider是DaoAuthenticationProvider。
下面看DaoAuthenticationProvider放入关系:

其实,验证都在AbstractUserDetailsAuthenticationProvider中。
其中,retrieveUser在子类中实现。


开始预检查:

预检查

然后,进行附加的检查:

具体看附加的检查,这里还是需要到子类中看:

然后,进入后检查

这个后检查,主要是检查是否过期

成功。

现在重新赋值权限,返回Authentication(已认证)。

===========================
===========================
这个时候,已经return了。返回到最开始UsernamePasswordFileter,这里开始成功或是失败的处理器。

三:session共享
1.说明
这里从AbstractAuthenticationProcessingFilter开始,因为这里有一个成功后的处理方法是successfulAuthentication。
2.流程图

3.断点

关于SecurityContextHolder,是将authentication放入线程,然后当前线程的任何方法都可以拿到authentication。
4.最前面的一个过滤器
这个过滤器以前没有讲过,这个过滤器的作用,请求先经过,然后是响应返回的时候最后一个经过。

这里先检查session是否有security context,如果有,则将其从session中取出放入线程,没有就继续。
在返回的时候,会再检查线程,如果线程中有security context,如果有则拿出来放入session中。
5.再说明
不同的请求,就可以从同一个session中拿到相同的用户认证信息。
拿到后,放入线程中。
这里就是认证结果在多个请求之间共享。
四:获取认证用户信息
1.说明
这里的意思是从session中获取。
2.程序
将程序写在UserController中。
@GetMapping("/securityContext")
public Object getSecurityContext() {
return SecurityContextHolder.getContext().getAuthentication();
}
3.启动程序,进行访问

4.简单的程序
@GetMapping("/securityContext")
public Object getSecurityContext(Authentication authentication) {
return authentication;
}
014 Security的认证流程源码级详解的更多相关文章
- Spring Security教程(八):用户认证流程源码详解
本篇文章主要围绕下面几个问题来深入源码: 用户认证流程 认证结果如何在多个请求之间共享 获取认证用户信息 一.用户认证流程 上节中提到Spring Security核心就是一系列的过滤器链,当一个请求 ...
- SpringBoot + Spring Security 学习笔记(二)安全认证流程源码详解
用户认证流程 UsernamePasswordAuthenticationFilter 我们直接来看UsernamePasswordAuthenticationFilter类, public clas ...
- Spring Security登录验证流程源码解析
一.登录认证基于过滤器链 Spring Security的登录验证流程核心就是过滤器链.当一个请求到达时按照过滤器链的顺序依次进行处理,通过所有过滤器链的验证,就可以访问API接口了. SpringS ...
- shiro认证流程源码分析--练气初期
写在前面 在上一篇文章当中,我们通过一个简单的例子,简单地认识了一下shiro.在这篇文章当中,我们将通过阅读源码的方式了解shiro的认证流程. 建议大家边读文章边动手调试代码,这样效果会更好. 认 ...
- JobTracker启动流程源码级分析
org.apache.hadoop.mapred.JobTracker类是个独立的进程,有自己的main函数.JobTracker是在网络环境中提交及运行MR任务的核心位置. main方法主要代码有两 ...
- mapreduce job提交流程源码级分析(三)
mapreduce job提交流程源码级分析(二)(原创)这篇文章说到了jobSubmitClient.submitJob(jobId, submitJobDir.toString(), jobCop ...
- [Android]Android系统启动流程源码分析
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5013863.html Android系统启动流程源码分析 首先 ...
- SpringSecurity 初始化流程源码
SpringSecurity 初始化流程源码 本篇主要讲解 SpringSecurity初始化流程的源码部分,包括核心的 springSecurityFilterChain 是如何创建的,以及在介绍哪 ...
- SpringSecurity 默认表单登录页展示流程源码
SpringSecurity 默认表单登录页展示流程源码 本篇主要讲解 SpringSecurity提供的默认表单登录页 它是如何展示的的流程, 涉及 1.FilterSecurityIntercep ...
随机推荐
- mysql报ERROR:Deadlock found when trying to get lock; try restarting transaction(nodejs)
1 前言 出现错误 Deadlock found when trying to get lock; try restarting transaction.然后通过网上查找资料,重要看到有用信息了. 错 ...
- Android一个自定义的进度环:ProgressChart
源代码及可执行文件下载地址:http://files.cnblogs.com/rainboy2010/ProgressChart.zip 因项目需要,自己尝试定义了一个进度环,用于显示进度,实现效果如 ...
- 数据结构HashMap(Android SparseArray 和ArrayMap)
HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据 ...
- yum -y 与yum有何区别(转载)
在linux中,经常使用yum来进行软件的安装,更新与卸载,那我们会发现,在使用yum的时候,通常有下面两种指令模式: ①yum install xxx ②yum -y install ...
- Vue+restfulframework示例
一.简单回顾vue 前不久我们已经了解了vue前端框架,所以现在强调几点: 修改源: npm config set registry https://registry.npm.taobao.org 创 ...
- Vue-CLI 3.x 设置反向代理
最近在项目中使用了Vue CLI 3.0版本,项目中需要设置反向代理解决跨域问题,下面记录一下设置过程. 新建配置文件 (vue-cli3.x 官网的配置文档 https://cli.vuejs.or ...
- jdbc问题:Access denied for user ''@'localhost''是因为没输入账户和密码
Access denied for user ''@'localhost' to database 'bjpowernode'
- IDM的Google商店插件
官方扩展链接:https://chrome.google.com/webstore/detail/idm-integration-module/ngpampappnmepgilojfohadhhmbh ...
- Just Oj 2017C语言程序设计竞赛高级组D: 字符串最大表示(next数组)
D: 字符串最大表示 时间限制: 1 s 内存限制: 128 MB 题目描述 有如下定义,abcnabcn表示字符串abc重复n次,例如abc2abc2表示abcabc. 给定一个字符串,求 ...
- SHELL打印两个日期之间的日期
SHELL打印两个日期之间的日期 [root@umout shell]# cat date_to_date.sh THIS_PATH=$(cd `dirname $0`;) cd $THIS_PATH ...