zoukankan      html  css  js  c++  java
  • 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中。

    1   @GetMapping("/securityContext")
    2     public Object getSecurityContext() {
    3         return SecurityContextHolder.getContext().getAuthentication();
    4     }

    3.启动程序,进行访问

      

    4.简单的程序

    1     @GetMapping("/securityContext")
    2     public Object getSecurityContext(Authentication authentication) {
    3         return authentication;
    4     }

      

      

  • 相关阅读:
    全站生成静态文件的通用方法
    Web.config配置文件详解(新手必看)
    iis7/7.5设置上传文件最大大小
    C# 中的常用正则表达式总结
    60款很酷的 jQuery 幻灯片演示和下载
    DataReader记录生成多列的表格
    正则表达式
    博客转移
    ASP.Net学习之常用SQL存储过程(1)
    遍历Request的信息
  • 原文地址:https://www.cnblogs.com/juncaoit/p/9745705.html
Copyright © 2011-2022 走看看