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 ...
随机推荐
- 5)协程二(yeild from)
一:yield from说明 python从3.3版本开始使用yield from 替代yield yield from 结构会在内部自动捕获 StopIteration 异常. 这种处理方式与 ...
- C#简单画图程序
实现过程: (1) 新建窗体应用程序 (2) 添加一个MenuScrip控件:添加一个ToolScrip控件. 在ToolScrip控件中对每个单元,要将DisplayStyle属性改为Text (3 ...
- Confluence 6 从外部目录中同步数据配置同步间隔
在用户目录(User Directories)界面中显示了最后的系统同步时间,包括有这次同步所花费的时间. 注意:针对 Crowd 和 Jira 目录同步时间的配置只在 Confluence 3.5 ...
- LeetCode(87):扰乱字符串
Hard! 题目描述: 给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树. 下图是字符串 s1 = "great" 的一种可能的表示形式. gr ...
- SpringBoot图片上传(二)
需求简介:做新增的时候,需要上传图片.(⊙o⊙)…这需求描述也太简单了吧,限制文件大小60*60 512kb ,第一次做,记录一下嗷,废话就不啰嗦了 上代码 代码: //html代码<div c ...
- 页面初始化的js函数要放在最最最最最最最前边!否则没效果
简单说一下这个情况,html的页面的各部分都是动态渲染的,所以头部的某些个样式调用函数需要在页面初始化的时候被加载,这个我也是知道的,结果后边代码敲着敲着,就把这个事儿给忘了,然后启动项目的时候,页面 ...
- bzoj3991 lca+dfs序应用+set综合应用
/* 给定一棵树,树上会出现宝物,也会有宝物消失 规定如果要收集树上所有宝物,就要选择一个点开始,到每个宝物点都跑一次,然后再回到那个点 现在给定m次修改,每次修改后树上就有一个宝物消失,或者一个宝物 ...
- cf1084d 非常巧妙的树形dp
/* 给定n城市,m条道路,每条路耗油w,每个点有油a[i],从任意点出发,求最大可以剩下的油 dp[i]表示从i开始往下走的最大收益,ans表示最大结果 因为走过的路不能走,所以可以想到最优解肯定经 ...
- jacoco + eclipse单元测试覆盖率
概念 Jacoco:JaCoCo是一个开源的覆盖率工具,它针对的开发语言是java,其使用方法很灵活,可以嵌入到Ant.Maven中:可以作为Eclipse插件,可以使用其JavaAgent技术监控J ...
- C++ 使用system()实现锁定屏幕
除了使用函数“LockWorkStation()”实现锁定屏幕,参考:http://www.cnblogs.com/Satu/p/8183081.html 此外,也可以使用函数“system()”来实 ...