一:任务

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的认证流程源码级详解的更多相关文章

  1. Spring Security教程(八):用户认证流程源码详解

    本篇文章主要围绕下面几个问题来深入源码: 用户认证流程 认证结果如何在多个请求之间共享 获取认证用户信息 一.用户认证流程 上节中提到Spring Security核心就是一系列的过滤器链,当一个请求 ...

  2. SpringBoot + Spring Security 学习笔记(二)安全认证流程源码详解

    用户认证流程 UsernamePasswordAuthenticationFilter 我们直接来看UsernamePasswordAuthenticationFilter类, public clas ...

  3. Spring Security登录验证流程源码解析

    一.登录认证基于过滤器链 Spring Security的登录验证流程核心就是过滤器链.当一个请求到达时按照过滤器链的顺序依次进行处理,通过所有过滤器链的验证,就可以访问API接口了. SpringS ...

  4. shiro认证流程源码分析--练气初期

    写在前面 在上一篇文章当中,我们通过一个简单的例子,简单地认识了一下shiro.在这篇文章当中,我们将通过阅读源码的方式了解shiro的认证流程. 建议大家边读文章边动手调试代码,这样效果会更好. 认 ...

  5. JobTracker启动流程源码级分析

    org.apache.hadoop.mapred.JobTracker类是个独立的进程,有自己的main函数.JobTracker是在网络环境中提交及运行MR任务的核心位置. main方法主要代码有两 ...

  6. mapreduce job提交流程源码级分析(三)

    mapreduce job提交流程源码级分析(二)(原创)这篇文章说到了jobSubmitClient.submitJob(jobId, submitJobDir.toString(), jobCop ...

  7. [Android]Android系统启动流程源码分析

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5013863.html Android系统启动流程源码分析 首先 ...

  8. SpringSecurity 初始化流程源码

    SpringSecurity 初始化流程源码 本篇主要讲解 SpringSecurity初始化流程的源码部分,包括核心的 springSecurityFilterChain 是如何创建的,以及在介绍哪 ...

  9. SpringSecurity 默认表单登录页展示流程源码

    SpringSecurity 默认表单登录页展示流程源码 本篇主要讲解 SpringSecurity提供的默认表单登录页 它是如何展示的的流程, 涉及 1.FilterSecurityIntercep ...

随机推荐

  1. windows连接服务端的域名正常,linux却不通,(针对于负载均衡后端节点设置)

    1.初步判断不是网络上的,因为windows主机访问正常, 2.修改客户端linux主机 net.ipv4.tcp_tw_recycle=0,测试是否正常,(服务器当连接数达到一定量之后,会执行rec ...

  2. Flask允许跨域

    什么是跨域 在 HTML 中,<a>, <form>, <img>, <script>, <iframe>, <link> 等标 ...

  3. cdh5.15集群添加spark2.3服务(parcels安装)

    背景: 机器系统:redhat7.3:已经配置了http服务 集群在安装的时候没有启动spark服务,因为cdh5.15自带的spark不是2.0,所以直接进行spark2.3的安装 参考文档:htt ...

  4. Confluence 6 配置管理员联系页面

    管理员联系页面是一个格式化的页面,这个页面能够允许 Confluence 用户在 Confluence 中向管理员发送消息(在这部分的内容,管理员是默认管理员用户组的成员). 有关用户组的解释,请参考 ...

  5. Java语法基础常见疑惑解答

    1. 类是java的最小单位,java的程序必须在类中才能运行 2. java函数加不加static有何不同 java中声明为static的方法称为静态方法或类方法.静态方法可以直接调用静态方法,访问 ...

  6. vue-cli脚手架(框架)

    一.创建vue项目 npm install vue-cli -g #-g全局 (sudo)npm install vue-cli -g #mac笔记本 vue-init webpack myvue # ...

  7. poj3417lca+树上差分

    /* 给定n个点的树,在其中加入m条新边(称为非树边) 现在可以割断一条树边,一条非树边,使图分裂成两个联通块,请问有几种切割方式 对树边进行分情况讨论 如果树边不处在环中,则割断这条树边后可以割断任 ...

  8. bzoj1912 树形dp求直径(新写法),求直径的两端点

    通过回溯法可以求出直径的两个端点,同时注意有负权边的树求直径不可以用两次dfs来求,而必须用dp做 /* 分情况讨论问题 一条边也不加的情况,显然每条边要扫描两次, 该情况的答案是2(n-1) 只加一 ...

  9. selenium 操作复选框

    场景 从上一节的例子中可以看出,webdriver可以很方便的使用findElement方法来定位某个特定的对象,不过有时候我们却需要定位一组对象, 这时候就需要使用findElements方法. 定 ...

  10. Django复习

    django复习 django和其他框架的对比 django,集成很多功能的大型框架,为开发者提供了很多方便的组件:orm.form.ModelForm.auth.admin.contenttypes ...