spring security源码追踪理解(一)

一、前言

近期看了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.rhkb.cn/news/381213.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【面试题】Redo log和Undo log

Redo log 介绍Redo log之前我们需要了解一下,mysql数据操作的流程: 上述就是数据操作的流程图,可以发现sql语句并不是直接操作的磁盘而是通过操作内存,然后进行内存到磁盘的一个同步。这里我们必须要了解一些区域: 缓…

c++基础(类和对象中)(类的默认成员函数)

目录 一.构造函数(类似初始化) 1.概念 2.构造函数的特点 二.析构函数(类似 销毁对象/空间) 三.拷贝构造函数(类似复制粘贴的一种 初始化 ) 1.概念: 2.拷贝构造的特点: 四.赋值运算符重载&#xff08…

IDEA的工程与模块管理

《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试(Debug) 第七章 …

STM32的ADC详解

目录 一、ADC简介 二、ADC的时钟 三、ADC特性 四、ADC功能说明 五、规则通道和注入通道 1.规则通道 2.注入通道 3.区别 六、数据寄存器 1.右对齐 2.左对齐 七、转换模式 1.单次转换模式 2.续转换模式 3.扫描模式 4.区别 八、程序实现 1.需求 2.ADC初始化 3.A…

ipv6 基础学习(一)

IPv6 为什么要有IPV6? IPv4地址空间有限:IPv4使用32位地址,最多可提供约43亿个地址。随着互联网设备数量的爆炸式增长,这些地址已经几乎耗尽。 IPv6地址空间庞大:IPv6使用128位地址,可以提供大约3.410^3…

爬虫自己做的

1.urllib 1.1基本使用 1.2 下载(图片,页面,视频) 1.3 get 1.3.1 quote 中文变成对应uncode编码 当url 的wd中文时 quote是将中文变成对应uncode编码 然后拼接成完整的url 1.3.2urlencode方法 wd有多个参数 1.3.3ajas get实例 …

【Git远程操作】理解分布式管理 | 创建远程仓库

目录 1.理解分布式管理 多人协作开发 2.创建远程仓库 2.1仓库名&路径 2.2初始化仓库&设置模板 1.理解分布式管理 目前我们学习的所有内容都是在本地来完成的。(add /commit /版本撤销回退/分支管理) Git是一个分布式 的版本控制系统。 分支…

动漫风格动漫404网站维护HTML源码

源码介绍 动漫风格动漫404网站维护HTML源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面 效果预览 源码下载 动漫风格动漫404网站维护HTML源码

【存储学习笔记】1:机械硬盘(Hard Drive Disk)结构和寻址方式

目录 HDD的结构HDD的寻址方式CHS寻址(不适用于等密度结构磁盘)LBA寻址(目前普遍使用的线性寻址方式) HDD的寻址速度 HDD的结构 盘面(Platter):单面或者双面覆盖着用于记录数据的磁性物质&#x…

Gateway源码分析:路由Route、断言Predicate、Filter

文章目录 源码总流程图说明GateWayAutoConfigurationDispatcherHandlergetHandler()handleRequestWith()RouteToRequestUrlFilterReactiveLoadBalancerClientFilterNettyRoutingFilter 补充知识适配器模式 详细流程图 源码总流程图 在线总流程图 说明 Gateway的版本使用的是…

配置单区域OSPF

目录 引言 一、搭建基础网络 1.1 配置网络拓扑图如下 1.2 IP地址表 二、测试每个网段都能单独连通 2.1 PC0 ping通Router1所有接口 2.2 PC1 ping通Router1所有接口 2.3 PC2 ping通Router2所有接口 2.4 PC3 ping通Router2所有接口 2.5 PC4 ping通Router3所有接口 2.…

【Gitlab】记一次升级 Gitlab 后 API 失效的问题

背景 前段时间,因内部使用的 Gitlab 版本存在漏洞,需要进行升级,于是乎,将 Gitlab 从 16.6.0 升级到 16.11.3。而我们项目有个接口是用于获取 Gitlab 上的开发人员。 然后,今天,突然发现这个接口获取不到…

Linux网络——套接字与UdpServer

目录 一、socket 编程接口 1.1 sockaddr 结构 1.2 socket 常见API 二、封装 InetAddr 三、网络字节序 四、封装通用 UdpServer 服务端 4.1 整体框架 4.2 类的初始化 4.2.1 socket 4.2.2 bind 4.2.3 创建流式套接字 4.2.4 填充结构体 4.3 服务器的运行 4.3.1 rec…

在树莓派4B上部署yolov8环境完成高帧率检测任务

目录 前言 在树莓派上安装Pytorch 在树莓派上安装Ultralytics环境 在树莓派上初步测试模型 在树莓派上安装NCNN 用NCNN模型实现高帧率检测 前言 在我前面的文章里讲了如何用yolov8从0开始训练自己的模型,现在这篇文章将教大家如何在树莓派上部署yolov8的环境…

【BUG】已解决:TypeError: Descriptors cannot not be created directly.

已解决:TypeError: Descriptors cannot not be created directly. 目录 已解决:TypeError: Descriptors cannot not be created directly. 【常见模块错误】 【错误原因】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来…

适用于618/7xx芯片平台 AT开发 远程FOTA升级指南教程

简介 AT版本的远程升级主要是对AT固件版本进行升级,实际方式为通过合宙官方IOT平台升级或者使用自己搭建的服务器进行升级服务。 该文档教程流程适用于 618/716S/718P 芯片平台的Cat.1模块 合宙IOT平台配置 升级日志 —— 如何查看 升级日志 —— 响应码列表 响应…

【BUG】已解决:ModuleNotFoundError: No module named ‘torch‘

已解决:ModuleNotFoundError: No module named ‘torch‘ 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市…

Unity-URP-SSAO记录

勾选After Opacity Unity-URP管线,本来又一个“bug”, 网上查不到很多关于ssao的资料 以为会不会又是一个极度少人用的东西 而且几乎都是要第三方替代 也完全没有SSAO大概的消耗是多少,完全是黑盒(因为用的人少,研究的人少,优…

ubuntu2204配置anacondacuda4090nvidia驱动

背景 某个机房的几台机器前段时间通过dnat暴露至公网后被入侵挖矿,为避免一些安全隐患将这几台机器执行重装系统操作; 这里主要记录配置nvidia驱动及cuda&anaconda。 步骤 大概分为几个步骤 禁用nouveau配置grub显示菜单install nvidia-driveri…

Qt Style Sheets-使用样式表自定义 Qt 部件

使用样式表自定义 Qt 部件 在使用样式表时,每个小部件都被视为具有四个同心矩形的框:边距矩形、边框矩形、填充矩形和内容矩形。框模型对此进行了更详细的描述。 盒模型 以下是四个同心矩形在概念上的呈现方式: 边距超出边框。边框绘制在边…