spring security认证的底层实现
一、官方认证图
- 发起认证请求,请求中携带用户名、密码,该请求会被
UsernamePasswordAuthenticationFilter
拦截- 在
UsernamePasswordAuthenticationFilter
的attemptAuthentication
方法中将请求中用户名和密码,封装为Authentication
对象,并交给AuthenticationManager
进行认证- 认证成功,将认证信息存储到 SecurityContextHodler 以及调用记住我(如有开启)等,并回调
AuthenticationSuccessHandler
处理- 认证失败,清除 SecurityContextHodler 以及记住我中信息(如有开启),回调
AuthenticationFailureHandler
处理
二、AuthenticationManager 、ProviderManager、AuthenticationProvider的关系
从上面分析中得知,AuthenticationManager 是认证的核心类,但实际上在底层真正认证时还离不开 ProviderManager 以及 AuthenticationProvider
。他们三者关系是样的呢?
AuthenticationManager
是一个认证管理器,它定义了 Spring Security 过滤器要执行认证操作。ProviderManager
AuthenticationManager接口的实现类。Spring Security 认证时默认使用就是 ProviderManager。AuthenticationProvider
就是针对不同的身份类型执行的具体的身份认证
。
ProviderManager 是 AuthenticationManager 的唯一实现,也是 Spring Security 默认使用实现。
从这里不难看出默认情况下AuthenticationManager 就是一个ProviderManager。
- 在 Spring Seourity 中,
允许系统同时支持多种不同的认证方式,例如同时支持用户名/密码认证、ReremberMe 认证、手机号码动态认证等
,而不同的认证方式对应了不同的 AuthenticationProvider,所以一个完整的认证流程可由多个AuthenticationProvider 来提供。- 多个 AuthenticationProvider 将组成一个列表,这个列表将由 ProviderManager代理。换句话说,
在ProviderManager 中存在一个 AuthenticationProvider 列表,在ProviderManager 中遍历列表中的每一个 AuthenticationProvider 去执行身份认证
,最终得到认证结果。- ProviderManager
本身也可以再配置一个 AuthenticationManager 作为 parent,这样当ProviderManager 认证失败之后,就可以进入到 parent中再次进行认证
理论上来说,ProviderManager 的 parent 可以是任意类型的 AuthenticationManager,但是通常都是由 ProviderManager 来扮演 parent 的角色,也就是ProviderManager 是 ProviderManager 的 parent。- 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认证的底层实现相关推荐
- Spring Security认证过程
2019独角兽企业重金招聘Python工程师标准>>> Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一 ...
- 看清spring security 认证流程,自定义认证方式
一.文献参考 Spring Security认证与授权的原理(源码分析,超详细)_Zystem-CSDN博客_springsecurity认证原理 spring security为什么这么复杂? - ...
- spring security 认证与权限控制
目录 1. 使用授权和认证的必要性 2. spring security 与 shiro 与 过滤器,拦截器 3. 具体配置使用 项目地址: https://github.com/sevenyoung ...
- 大白话详解Spring Security认证流程
前言 Spring Seuciry相关的内容看了实在是太多了,但总觉得还是理解地不够巩固,还是需要靠知识输出做巩固. 相关版本: java: jdk 8 spring-boot: 2.1.6.RELE ...
- Spring Security 认证执行流程
本文基于 Spring Security 5.x 推荐阅读: 项目集成Spring Security SpringSecurity 整合 JWT 一.外层-正常登陆调用 项目启动后会自动寻找 User ...
- Spring Security认证_Remember Me
Spring Security中Remember Me为"记住我"功能,即下次访问系统时无需重新登录.当使用"记住我"功能登录后,Spring Security ...
- spring security认证对密码进行MD5认证
在上一篇中写了如何自定义数据库用户表结构,这里补充一下怎么对用户输入的密码进行MD5认证,在老版本的spring security(笔者使用的是org.springframework.security ...
- Spring Security 认证与授权(二)
让 Spring Security 适应系统,而非让系统适应 Spring Security,是 Spring Security 框架开发者和使用者的共识. 下面我们将使用自定义数据库模型接入Spri ...
- Spring Security 认证授权详解
1.Spring Security 概述 1.1.Spring Security 简介 Spring Security 是 Spring 家族中的成员.Spring Security 基于 Sprin ...
最新文章
- struts2中报错404 No result defined for action com.jcrj.ahsfjd.ajgl.JdshAction and result input解决方法...
- 第三届全国大学生智能汽车竞赛获奖名单
- Windows文件系统过滤驱动开发教程(4,5)
- Colaboratory下载Kaggle数据
- CES 2021线上大会前瞻、Roblox 估值近300亿美元、联想将推出企业级 AR 眼镜等|Decode the Week...
- 数据结构---邻接矩阵的DFS
- 微信小程序保存图片到相册;uni-app小程序保存网络图片到相册;小程序保存图片到相册拒绝授权后重新拉起授权;保存图片到系统相册;小程序保存图片测试可以,真机保存图片失败
- 2009年即将过去,准备迎接2010
- 【转】iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD
- 23种设计模式(二十)数据结构之迭代器
- 光伏并网matlab,基于MATLAB的光伏并网设计
- c++反向输出一个三位数
- mapboxgl 互联网地图纠偏插件(三)
- Android利用反射获取WLAN热点信息
- 深度Linux安装火狐,deepin或Ubuntu安装最新版Firefox,并设置去掉标题栏
- Docker修改无法启动的容器的配置文件
- C语言中求最大公约数的算法(三种)
- Java页面跳转失效_求助各位java大神,为什么表单提交之后跳转页面失灵
- Android架构组件Room功能详解,面试必问
- Sixth season ninth episode,Ross got high blamed on Chandler so Monica‘s parents do not like him????
热门文章
- .Net Core 在 Linux-Centos上的部署实战教程(二)
- HUE配置文件hue.ini 的database模块详解(包含qlite、mysql、 psql、和oracle)(图文详解)(分HA集群和非HA集群)...
- Atitit 发帖机系列(7) 词法分析的方法attilax大总结)
- Linux下制作和使用静态库和动态库
- Python学习笔记:错误,测试,调试(起)
- Python学习笔记:装饰器
- 通过printf设置Linux终端输出的颜色和显示方式
- 高性能计算的线程模型:Pthreads 还是 OpenMP
- CentOS启用sudo方法
- Python 保存数组至.mat文件,报错:AttributeError: 'numpy.ndarray' object has no attribute 'items'