spring security源码追踪理解(一)

news2024/11/14 13:54:20

一、前言

近期看了spring security相关的介绍,再加上项目所用若依框架的底层安全模块也是spring security,所以想从源码的角度加深下对该安全模块的理解(看源码之前,我们要先有个意识,那就是spring security安全模块主要是通过filter实现安全功能的)。为了防止迷失在源码的追踪中,我们首先列出自己感兴趣的点,然后带着问题去阅读源码:

1)spring security的入口是哪个类

2)spring security工作流程是什么样的

3)spring security用户名密码的认证逻辑是什么样的,密码是加密后比对吗

4)spring security针对每个请求都要去查一次用户信息吗,

5)spring security匿名访问是如何跨过认证授权的

6)spring security权限认证逻辑是什么

接下来我们正式进入源码阶段。

二、spring security入口类

我们在登录接口加上断点,查看方法栈,可以发现,如果以进入spring security模块为入口,那么spring security的入口是DelegatingFilterProxy类:

三、spring security工作流程

DelegatingFilterProxy的doFilter方法最后会反射调用FilterChainProxy过滤器链代理类的doFilter方法。FilterChainProxy过滤器链代理类是spring security模块过滤器链的代理类。我们接着到invokeDelegate方法中看一下:

因为delegate是FilterChainProxy对象,所以这里本质上执行的是FilterChainProxy的doFilter方法,所以我们进入该方法查看:

可以看到过滤器链代理类里面会调用getFilters方法获取一系列的过滤器,接着我们看下其获取过滤器的具体逻辑:

可以看到其会遍历所有实现SecurityFilterChain接口的过滤器链(这属于一个扩展功能,我们可以添加自定义实现的过滤器链),spring security默认有一个实现类就是DefaultSecurityFilterChain,后面会调用该链的匹配方法,如果当前请求与过滤器链匹配,则获取过滤器链中包含的所有过滤器。我们接着到DefaultSecurityFilterChain中看下具体实现:

可以看到DefaultSecurityFilterChain默认会匹配所有请求,接着我们看下其返回的过滤器有哪些:

可以看到一共返回13个过滤器。我们接着向下走:

可以看到其会将获取的过滤器列表以及请求等封装成一个虚拟过滤器链,并调用该链的doFilter方法。接下来我们到该方法中看下具体情况:

这里主要留意两个亮点,一是封装的13个过滤器执行完后会调用ApplicationFilterChain过滤器链。另一个是过滤器处理方法中会接收当前对象,这样在过滤器处理结束时再调用该对象的doFilter的方法,就可以达到遍历过滤器方法的目的。

以上就是spring security功能实现的主流程,因为过滤器比较多,我们不一个个去看,我们后面可以直接看感兴趣的过滤器的处理方法逻辑。接下来我们根据前面的兴趣点一个个查看。

四、spring security用户名密码校验逻辑(基于若依框架)

用户名密码校验一般是再登录方法中进行的处理,这里我们直接到login接口中进行查看:

可以看到校验是调用authenticationManager的处理方法,我们接着进里面查看:

通过断点可以知道authenticationManager的实现类是WebSecurityConfigurerAdapter中的内部,所以我们进入看下处理逻辑:

这里先简单说明一个概念,就是用户名密码的认证基本都是通过provider进行执行的,providerManager则是管理provider的类。我们接着看上一步的逻辑,因为providerManager中包含的AnonymousAuthenticationProvider不支持该认证,所以会调用其父类的处理方法:

这里的parent还是providerManager对象(注意这个providerManager跟当前的providerManager不是同一个对象,可以看它们的对象标识后缀是不同的,其只是逻辑上的parent,而不是继承关系)。我们接着进入providerManager的authenticate方法:

可以看到这次的provider是DaoAuthenticationProvider,并且支持当前用户名密码校验,我们进入看下详细的校验逻辑:

因为DaoAuthenticationProvider继承AbstractUserDetailsAuthenticationProvider类,且没有重写authenticate方法,所以实际进入的是后者的处理逻辑中,我们接着向下看:

这里我们先看下如何从数据库拿用户信息:

这里可以看到,具体如何拿用户信息的逻辑是开放给用户的,需要我们自己去实现这块的逻辑。接着我们看拿到用户信息后如何进行校验:

首先是前置校验,其主要是校验用户的一些属性是否符号要求,这块的代码也要求用户自己实现。通过debug可以看到,调用的都是UserDetails自己的处理方法,而UserDetails是一个接口,其实现类是用户自己编辑的LoginUser。我们接着看下面的校验方法:

在这终于可以看到密码的校验逻辑了,其将登录传入的密码和自定义实现UserDetailsService接口查询出的用户信息进行比较,以此进行验证。

注意,spring secutiry用户名密码校验的过程中,我们需要参与的有两点:一是实现UserDetailsService接口,其包含根据用户名获取用户信息的接口。二是实现UserDetails接口,其包含了查出的基本用户信息,以及一些自定义的校验方法。

五、总结

1、spring security的入口是DelegatingFilterProxy

2、spring security工作流实现是通过过滤器链实现的

3、spring security认证过程是根据用户名从数据库查密码,然后跟页面传入的密码进行比对。

4、认证过程主要是基于若依框架的逻辑进行,如果不是该框架,可能登录认证的过程与之不一样

5、因为后面还有很多要写的,所以这里分两篇文章编辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1939205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阵列信号处理学习笔记(二)--空域滤波基本原理

阵列信号 阵列信号处理学习笔记(一)–阵列信号处理定义 阵列信号处理学习笔记(二)–空域滤波基本原理 文章目录 阵列信号前言一、阵列信号模型1.1 信号的基本模型1.2 阵列的几何构型1.3 均匀直线阵的阵列信号基本模型 总结 前言…

【C语言】 链表实现学生管理系统(堆区开辟空间)

总体思路都能写出来,问题是感觉稍微比之前的麻烦一些,在刚开始创建结构体的时候,并没有去按照链表的思路去写,导致写成了顺序表,后面就一直纠结空间怎么开辟。 链表是由一个头节点和其它申请出来的小节点连起来的&…

UE4学习过程记录——无法更改默认pawn类

一、概述 需要学习UE4,在跟着官方网站的教程中出现一些问题,在这里记录下来。 二、问题阐述 如图所示,在UE4中无法更改默认的pawn类,其下拉无法进行下拉。 三、问题解决 如图所示,需要注意,这个地方在游戏…

SpringMvc有几个上下文

你好,我是柳岸花明。 SpringMVC作为Spring框架的重要组成部分,其启动流程和父子容器机制是理解整个框架运行机制的关键。本文将通过一系列详细的流程图,深入剖析SpringMVC的启动原理与父子容器的源码结构。 SpringMVC 父子容器 父容器的创建 …

【人工智能】深度剖析AI伦理:强化隐私防线,推动算法公平性的核心议题

文章目录 🍊1 人工智能兴起背后的伦理及道德风险1.1 算法偏见与歧视1.2 数据隐私侵权1.3 透明度受限1.4 决策失衡1.5 AI生成内容的危险性 🍊2 建构AIGC伦理观:实现人机共创的永续提升2.1 技术手段与伦理预防2.2 即时警告与紧急关停措施2.3 法…

.NET 通过系统影子账户实现权限维持

01阅读须知 此文所节选自小报童《.NET 内网实战攻防》专栏,主要内容有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧。 02基本介绍 03编码实现 在 Windows 操作系统中,影子用户通常是指那些不易被普通用户或系统管理员察觉的隐藏用户账户&…

Linux openEuler_24.03部署MySQL_8.4.0 LTS安装实测验证安装以及测试连接全过程实操手册

Linux openEuler_24.03部署MySQL_8.4.0 LTS安装实测验证安装以及测试连接全过程实操手册 前言: 什么是 MySQL? MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于Oracle 公司。MySQL 是一种关系型数据库管理系统,关系型数据库将数据保存在不同的表中,…

《问题002:报错-“Cannot read property ‘envId‘ of undefined“》

微信小程序云开发报错“Cannot read property ‘envId‘ of undefined“原因及解决办法 原因一:可能是你没有配置envId(解决步骤如下) 1、点击开发者工具上的云开发去获取/复制envId 2、找到配置文件envList.js 原因二:如果你已经完成意思步骤还是不行…

【人工智能】基于yolov5使用OrangePi玩转AI图片识别

前言 机缘巧合之下有幸得到了一块OrangePi AIpro边缘计算开发板,非常感谢香橙派官方推出的OrangePi AIpro边缘计算开发板。Orange Pi AI Pro 开发板是由香橙派和华为合作开发的高性能AI开发板,搭载了昇腾AI处理器,提供了8TOPS INT8的计算能力…

用html做python教程01

用html做python教程01 前言开肝构思实操额外修饰更换字体自适应 最后 前言 今天打开csdn的时候,看见csdn给我推荐了一个python技能书。 说实话,做得真不错。再看看我自己,有亿点差距😟。 开肝 先创建一个文件,后缀…

【大数据面试题】37 Doris 是怎么保证性能的?

一步一个脚印,一天一道大数据面试题 博主希望能够得到大家的点赞收藏支持!非常感谢 点赞,收藏是情分,不点是本分。祝你身体健康,事事顺心! Doris 是当下大热的 MPP 数据库,下面来聊聊它如何保证…

力扣每日一题1186. 删除一次得到子数组最大和【动态规划】

本题的核心在于对于每个元素,我们分别考虑保留和删除两种状态,并根据前面的状态转移来更新当前状态。最后,遍历所有元素,找到最大和即可。 状态定义 dp[i][0] 表示以第 i 个元素结尾且未删除元素的子数组的最大和。dp[i][1] 表示…

ClamAV:Linux病毒查杀软件安装使用

简介:ClamAV是一个开源防病毒工具包,专为邮件网关上的电子邮件扫描而设计。它提供了许多实用程序,包括一个灵活且可扩展的多线程守护进程、一个命令行扫描程序和用于自动数据库更新的高级工具。该软件包的核心是以共享库的形式提供的防病毒引…

大豆叶部病害soybean-目标检测数据集(包括VOC格式、YOLO格式)

大豆叶部病害soybean-目标检测数据集(包括VOC格式、YOLO格式) 数据集: 链接:https://pan.baidu.com/s/1DIq2vp-z_fM7Xj_nsBAGBQ?pwdk373 提取码:k373 数据集信息介绍: 共有 1232 张图像和一一对应的标注…

python 打包

#导出依赖文件列表 pip freeze > requirements.txt #安装对应文件 pip install -r requirements.txt #将依赖打成对应whl文件 pip wheel --wheel-dir ./dist -r ./requirements.txt #安装whl文件 pip install …whl

消费金融系统开发回忆录

架构设计图 整个支付链路上的功能 支付系统应该有:账户管理、渠道管理、支付管理、对账管理、清算管理、结算管理 一笔支付订单,在支付系统侧就是要记录清楚,谁发起的、对哪个商品进行支付、通过哪个渠道支付、支付时间、支付结果等…

【Linux知识点汇总】07 Linux系统防火墙相关命令,关闭和开启防火墙、开放端口号

​完整系列文章目录 【Linux知识点汇总】 心血来潮突然想起之前写过的系列文章【Linux知识点汇总】还未完结,那么今天就继续吧 说明:这个系列的内容,在系列【Linux服务器Java环境搭建】中会经常用到,大家可以自行查找相关命令 一、…

SMU Summer 2024 div2 2nd

文章目录 The Second Week一、前言二、算法1.二分图匹配/匈牙利算法<1>&#xff08;[ZJOI2007]矩阵游戏&#xff09;<2>&#xff08;有大家喜欢的零食吗&#xff09; 2.优先队列<1>&#xff08;Running Median&#xff09;<2>&#xff08;旅途的终点&a…

运维团队如何高效监控容器化环境中的PID及其他关键指标

随着云计算和容器化技术的快速发展&#xff0c;越来越多的企业开始采用容器化技术来部署和管理应用程序。然而&#xff0c;容器化环境的复杂性和动态性给运维团队带来了前所未有的挑战。本文将从PID&#xff08;进程标识符&#xff09;监控入手&#xff0c;探讨运维团队如何高效…

下载最新版Anaconda、安装、更换源、配置虚拟环境并在vscode中使用

文章目录 进入官网进入下载页安装更换源配置虚拟环境env安装包requests在vscode中使用虚拟环境 进入官网 https://repo.anaconda.com/ 或进入清华大学下载 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 进入下载页 安装 更换源 查看已经存在的镜像源 bash cond…