一、官方认证图

  1. 发起认证请求,请求中携带用户名、密码,该请求会被UsernamePasswordAuthenticationFilter 拦截
  2. UsernamePasswordAuthenticationFilterattemptAuthentication方法中将请求中用户名和密码,封装为Authentication对象,并交给AuthenticationManager 进行认证
  3. 认证成功,将认证信息存储到 SecurityContextHodler 以及调用记住我(如有开启)等,并回调 AuthenticationSuccessHandler 处理
  4. 认证失败,清除 SecurityContextHodler 以及记住我中信息(如有开启),回调 AuthenticationFailureHandler 处理

二、AuthenticationManager 、ProviderManager、AuthenticationProvider的关系

从上面分析中得知,AuthenticationManager 是认证的核心类,但实际上在底层真正认证时还离不开 ProviderManager 以及 AuthenticationProvider 。他们三者关系是样的呢?

  • AuthenticationManager 是一个认证管理器,它定义了 Spring Security 过滤器要执行认证操作。
  • ProviderManager AuthenticationManager接口的实现类。Spring Security 认证时默认使用就是 ProviderManager。
  • AuthenticationProvider 就是针对不同的身份类型执行的具体的身份认证


ProviderManager 是 AuthenticationManager 的唯一实现,也是 Spring Security 默认使用实现。从这里不难看出默认情况下AuthenticationManager 就是一个ProviderManager。

  1. 在 Spring Seourity 中,允许系统同时支持多种不同的认证方式,例如同时支持用户名/密码认证、ReremberMe 认证、手机号码动态认证等,而不同的认证方式对应了不同的 AuthenticationProvider,所以一个完整的认证流程可由多个AuthenticationProvider 来提供。
  2. 多个 AuthenticationProvider 将组成一个列表,这个列表将由 ProviderManager代理。换句话说,在ProviderManager 中存在一个 AuthenticationProvider 列表,在ProviderManager 中遍历列表中的每一个 AuthenticationProvider 去执行身份认证,最终得到认证结果。
  3. ProviderManager 本身也可以再配置一个 AuthenticationManager 作为 parent,这样当ProviderManager 认证失败之后,就可以进入到 parent中再次进行认证理论上来说,ProviderManager 的 parent 可以是任意类型的 AuthenticationManager,但是通常都是由 ProviderManager 来扮演 parent 的角色,也就是ProviderManager 是 ProviderManager 的 parent。
  4. ProviderManager 本身也可以有多个,多个ProviderManager 共用同一个parent。有时,一个应用程序有受保护资源的逻辑组(例如,所有符合路径模式的网络资源,如/api/**),每个组可以有自己的专用 AuthenticationManager。通常,每个组都是一个ProviderManager,它们共享一个父级。然后,父级是一种 全局资源,作为所有提供者的后备资源。

弄清楚认证原理之后我们来看下具体认证时数据源的获取。默认情况下 AuthenticationProvider 是由 DaoAuthenticationProvider 类来实现认证的,在DaoAuthenticationProvider 认证时又通过 UserDetailsService 完成数据源的校验。他们之间调用关系如下:

总结: AuthenticationManager 是认证管理器,在 Spring Security 中有全局AuthenticationManager,也可以有局部AuthenticationManager。全局的AuthenticationManager用来对全局认证进行处理,局部的AuthenticationManager用来对某些特殊资源认证处理。当然无论是全局认证管理器还是局部认证管理器都是由 ProviderManger 进行实现。 每一个ProviderManger中都代理一个AuthenticationProvider的列表,列表中每一个实现代表一种身份认证方式。认证时底层数据源需要调用 UserDetailService 来实现。

三、如何配置全局AuthenticationManage

@Configuration
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {private final MyUserDetailService myUserDetailService;@Autowiredpublic WebSecurityConfigurer(MyUserDetailService myUserDetailService) {this.myUserDetailService = myUserDetailService;}//    @Bean
//    public UserDetailsService userDetailsService() {//        InMemoryUserDetailsManager userDetailsService = new InMemoryUserDetailsManager();
//        修改默认的用户名密码
//        userDetailsService.createUser(User.withUsername("aaa").password("{noop}123").roles("admin").build());
//        return userDetailsService;
//    }//springboot 对 security 默认配置中  在工厂中默认创建 AuthenticationManager
//    @Autowired
//    public void initialize(AuthenticationManagerBuilder builder) throws Exception {//    这里AuthenticationManagerBuilder是spring工厂中给我们创建好了的默认AuthenticationManager,拿到后就可以进行修改
//        System.out.println("springboot 默认配置: " + builder);
//    }//自定义AuthenticationManager 推荐(会覆盖spring工厂中的默认AuthenticationManager)并没有在工厂中暴露出来@Overridepublic void configure(AuthenticationManagerBuilder builder) throws Exception {System.out.println("自定义AuthenticationManager: " + builder);builder.userDetailsService(myUserDetailService);}//作用: 用来将自定义AuthenticationManager在工厂中进行暴露,可以在任何位置注入@Override@Beanpublic AuthenticationManager authenticationManagerBean() throws Exception {return super.authenticationManagerBean();}
}

spring security认证的底层实现相关推荐

  1. Spring Security认证过程

    2019独角兽企业重金招聘Python工程师标准>>> Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一 ...

  2. 看清spring security 认证流程,自定义认证方式

    一.文献参考 Spring Security认证与授权的原理(源码分析,超详细)_Zystem-CSDN博客_springsecurity认证原理 spring security为什么这么复杂? - ...

  3. spring security 认证与权限控制

    目录 1. 使用授权和认证的必要性 2. spring security 与 shiro 与 过滤器,拦截器 3. 具体配置使用 项目地址: https://github.com/sevenyoung ...

  4. 大白话详解Spring Security认证流程

    前言 Spring Seuciry相关的内容看了实在是太多了,但总觉得还是理解地不够巩固,还是需要靠知识输出做巩固. 相关版本: java: jdk 8 spring-boot: 2.1.6.RELE ...

  5. Spring Security 认证执行流程

    本文基于 Spring Security 5.x 推荐阅读: 项目集成Spring Security SpringSecurity 整合 JWT 一.外层-正常登陆调用 项目启动后会自动寻找 User ...

  6. Spring Security认证_Remember Me

    Spring Security中Remember Me为"记住我"功能,即下次访问系统时无需重新登录.当使用"记住我"功能登录后,Spring Security ...

  7. spring security认证对密码进行MD5认证

    在上一篇中写了如何自定义数据库用户表结构,这里补充一下怎么对用户输入的密码进行MD5认证,在老版本的spring security(笔者使用的是org.springframework.security ...

  8. Spring Security 认证与授权(二)

    让 Spring Security 适应系统,而非让系统适应 Spring Security,是 Spring Security 框架开发者和使用者的共识. 下面我们将使用自定义数据库模型接入Spri ...

  9. Spring Security 认证授权详解

    1.Spring Security 概述 1.1.Spring Security 简介 Spring Security 是 Spring 家族中的成员.Spring Security 基于 Sprin ...

最新文章

  1. struts2中报错404 No result defined for action com.jcrj.ahsfjd.ajgl.JdshAction and result input解决方法...
  2. 第三届全国大学生智能汽车竞赛获奖名单
  3. Windows文件系统过滤驱动开发教程(4,5)
  4. Colaboratory下载Kaggle数据
  5. CES 2021线上大会前瞻、Roblox 估值近300亿美元、联想将推出企业级 AR 眼镜等|Decode the Week...
  6. 数据结构---邻接矩阵的DFS
  7. 微信小程序保存图片到相册;uni-app小程序保存网络图片到相册;小程序保存图片到相册拒绝授权后重新拉起授权;保存图片到系统相册;小程序保存图片测试可以,真机保存图片失败
  8. 2009年即将过去,准备迎接2010
  9. 【转】iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD
  10. 23种设计模式(二十)数据结构之迭代器
  11. 光伏并网matlab,基于MATLAB的光伏并网设计
  12. c++反向输出一个三位数
  13. mapboxgl 互联网地图纠偏插件(三)
  14. Android利用反射获取WLAN热点信息
  15. 深度Linux安装火狐,deepin或Ubuntu安装最新版Firefox,并设置去掉标题栏
  16. Docker修改无法启动的容器的配置文件
  17. C语言中求最大公约数的算法(三种)
  18. Java页面跳转失效_求助各位java大神,为什么表单提交之后跳转页面失灵
  19. Android架构组件Room功能详解,面试必问
  20. Sixth season ninth episode,Ross got high blamed on Chandler so Monica‘s parents do not like him????

热门文章

  1. .Net Core 在 Linux-Centos上的部署实战教程(二)
  2. HUE配置文件hue.ini 的database模块详解(包含qlite、mysql、 psql、和oracle)(图文详解)(分HA集群和非HA集群)...
  3. Atitit 发帖机系列(7) 词法分析的方法attilax大总结)
  4. Linux下制作和使用静态库和动态库
  5. Python学习笔记:错误,测试,调试(起)
  6. Python学习笔记:装饰器
  7. 通过printf设置Linux终端输出的颜色和显示方式
  8. 高性能计算的线程模型:Pthreads 还是 OpenMP
  9. CentOS启用sudo方法
  10. Python 保存数组至.mat文件,报错:AttributeError: 'numpy.ndarray' object has no attribute 'items'