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 ...
随机推荐
- 洛谷P5110 块速递推 [分块]
传送门 思路 显然可以特征根方程搞一波(生成函数太累),得到结果: \[ a_n=\frac 1 {13\sqrt{337}} [(\frac{233+13\sqrt{337}}{2})^n-(\fr ...
- Confluence 6 针对你的数据库类型确定校验 SQL
不同的数据库通常要求不同的 SQL 校验查询.校验查询通常需要尽可能的简单,这个查询在链接从数据库连接池中取出的时候都会被执行一次. 针对不同的数据库类型,我们推荐先的校验查询 SQL: MySQL ...
- dubbo源码之服务消费
消费端启动初始化过程: 消费端的代码解析也是从配置文件解析开始的,服务发布对应的<dubbo:service,解析xml的时候解析了一个ServiceBean,并且调用ServiceConfig ...
- input标签 disabled 和 readonly的区别
需求描述:今天提交代码,老大审了一下,给我指出了一个改正的地方,XXX的详细信息页面(不是修改页面) input的内容是不能改的,给我指出的时候,我立马就知道了这个该怎么改了,加个readonly不就 ...
- Python实战一
要求:用户输入用户名和密码错误三次,就对该用户进行锁定,不让其进行登录. def match(name,pwd): '''匹配用户输入的信息,进行判断''' falg = True while fal ...
- hdu1198 普通的并查集
今天开始(第三轮)并查集,,之前学的忘了一些 本题很简单直接上代码 #include<iostream> #include<cstring> #include<cstdi ...
- Allegro PCB Design GXL (legacy) 元器件的坐标文件
Allegro PCB Design GXL (legacy) version 16.6-2015 一.菜单:Tools > Reports... 二.在“Available Reports ( ...
- Java 产生一个大于等于200,小于300的随机数,且是10的整数倍
public class Random200_300 { public static void main(String[] args) { int r1 = 0; while (true) { r1 ...
- C++ Primer 笔记——lambda表达式
1.一个lambda表达式表示一个可调用的代码单元,可以理解为一个未命名的内联函数,但是与函数不同,lambda表达式可能定义在函数内部.其形式如下: [capture list] (paramete ...
- Android 网络请求框架
1.okHttp 特点 简单.灵活.无连接.无状态 优势: 谷歌官方API在6.0之后在Android SDK中移除了HttpClient,然后他火了起来, 他支持SPDY(谷歌开发的基于TCP应用层 ...