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.mzph.cn/web/46726.shtml

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

相关文章

第122天:内网安全-域信息收集应用网络凭据CS 插件AdfindBloodHound

目录 前置知识 背景和思路 判断是否在域内 案例一:架构信息类收集-网络&用户&域控等 案例二:自动化工具探针-插件&Adfind&BloodHound Adfind(域信息收集工具) ​BloodHound(自动化域渗透工具) 前置知识 本…

搭建个人智能家居 7 - 空气颗粒物检测

搭建个人智能家居 7 - 空气颗粒物检测 前言说明PMS5003ESPHomeHomeAssistant结束 前言 到目前为止,我们这个智能家居系统添加了4个外设,分别是:LED灯、RGB灯、DHT11温度传感器和SGP30。今天继续添加环境测量类传感器“PMS5003空气颗粒物检测…

Windows FFmpeg 开发环境搭建

FFmpeg 开发环境搭建 FFmpeg命令行环境搭建使用FFmpeg官方编译的库Windows编译FFmpeg1. 下载[msys2](https://www.msys2.org/#installation)2. 安装完成之后,将安装⽬录下的msys2_shell.cmd中注释掉的 rem set3. 修改pacman 镜像源并安装依赖4. 下载并编译源码 FFmpeg命令行环境…

基于springboot和mybatis的RealWorld后端项目实战三之添加swagger

pom.xml添加依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><arti…

解决网页中的 video 标签在移动端浏览器(如百度访问网页)视频脱离文档流播放问题

问题现象 部分浏览器视频脱离文档流&#xff0c;滚动时&#xff0c;视频是悬浮出来&#xff0c;在顶部播放 解决方案 添加下列属性&#xff0c;可解决大部分浏览器的脱离文档流的问题 <videowebkit-playsinline""playsInlinex5-playsinlinet7-video-player-t…

AI辅助自动驾驶技术在2024年的发展与趋势

文章目录 综述 2024 年 AI 辅助研发趋势 第一章&#xff1a;引言 1.1 背景介绍 1.2 AI在自动驾驶中的地位和作用 1.3 2024年自动驾驶技术的现状 1.4 论文结构 第二章&#xff1a;AI技术在自动驾驶中的应用 2.1 深度学习算法在自动驾驶中的应用 2.2 数据分析与模式识别…

谷类大米农业行业网站源码系统 带完整的安装代码包以及搭建部署教程

系统概述 在当今数字化时代&#xff0c;农业行业也逐渐迈向信息化、智能化。为了满足谷类大米农业行业的信息化需求&#xff0c;我们推出了一款专为该行业设计的网站源码系统。该系统不仅具备丰富的行业特色功能&#xff0c;而且提供了完整的安装代码包以及详细的搭建部署教程…

【Java算法】前缀和 下

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【算法工作坊】算法实战揭秘 一.连续数组 题目链接&#xff1a;525.连续数组 代码 public int findMaxLength(int[] nums) {HashMap<Integer,Integer> mapnew HashMap<>();map.put(0,-1);…

Camera Raw:移去

Camera Raw 中的移去 Remove模块主要用于去除照片中的不需要的元素&#xff0c;比如污点、电线或其它干扰元素。 快捷键&#xff1a;B 移去面板中提供了三种移去模式&#xff1a;移除、修复以及仿制。 移除 Remove 通过智能算法和生成式 AI 来去除不需要的元素。 对象识别 Obje…

php 小白新手从入门到精通教程(第3版)

前言 PHP&#xff08;PHP: Hypertext Preprocessor&#xff09;即“超文本预处理器”&#xff0c;是在服务器端执行的脚本语言&#xff0c;尤其适用于Web开发并可嵌入HTML中。PHP语法学习了C语言&#xff0c;吸纳Java和Perl多个语言的特色发展出自己的特色语法&#xff0c;并根…

FastAPI 学习之路(五十二)WebSockets(八)接受/发送json格式消息

前面我们发送的大多数都是text类型的消息&#xff0c;对于text消息来说&#xff0c;后端处理出来要麻烦的多&#xff0c;那么我们可以不可以传递json格式的数据&#xff0c;对于前后端来说都比较友好&#xff0c;答案是肯定的&#xff0c;我们需要做下处理。 首先&#xff0c;…

云计算安全流程与管控要求的全面解析

华为云安全流程与管控要求的全面解析 引言 在云计算技术迅猛发展的背景下&#xff0c;云安全问题日益凸显其重要性。华为云作为行业的领军企业&#xff0c;其安全流程与管控要求不仅关乎自身的服务稳定性&#xff0c;更直接影响到广大用户的业务安全。本文将深入解析华为云的安…

InterSystems IRIS使用python pyodbc连接 linux环境,odbc驱动安装,DSN配置,数据源配置,linux中文不展示问题

1、官方文档 ODBC Installation and Validation on UNIX Systems | Using the InterSystems ODBC Driver | InterSystems IRIS for Health 2024.1 By default, a full ODBC installation is performed with a standard InterSystems installation. If you perform a custom i…

beego框架_golang web框架_使用介绍

beego简介 beego是一个用于快速开发Go应用的http框架&#xff0c;由Go语言方面的技术大牛设计。beego可以用来快速开发API、Web、后端服务等各种应用&#xff0c;是一个RESTful的框架&#xff0c;主要设计灵感来源于tornado、sinatra、flask这三个框架&#xff0c;但结合了Go本…

《Windows API每日一练》10.3 公用对话框

Windows最初发行时的主要目标之一就是提倡一种标准化的用户界面。对于公用菜单 项来说&#xff0c;这一目标实现得很快。几乎所有的软件制造商都采用了Alt-File-Open组合来打开 文件。但是&#xff0c;真正用来打开文件的对话框却经常很不一样。 从Windows 3.1开始&#xff0c…

【JVM基础02】——组成-程序计数器解读

目录 1- 引言&#xff1a;程序计数器1-1 程序计数器是什么&#xff1f;为什么用程序计数器&#xff1f;(What)(Why) 2- 核心&#xff1a;程序计数器的原理&#xff08;How&#xff09;2-1 使用 javap 查看程序计数器的作用2-2 多线程下程序计数器原理举例 3- 小结&#xff1a;什…

object-C 解答算法:移动零(leetCode-283)

移动零(leetCode-283) 题目如下图:(也可以到leetCode上看完整题目,题号283) 解题思路: 本质就是把非0的元素往前移动,接下来要考虑的是怎么移动,每次移动多少? 这里需要用到双指针,i 记录每次遍历的元素值, j 记录“非0元素值”需要移动到的位置; 当所有“非0元素值”都移…

vue3前端开发-小兔鲜项目-热门品牌推荐栏目

vue3前端开发-小兔鲜项目-热门品牌推荐栏目&#xff01;这一期内容&#xff0c;大家一定要认真的看完。因为&#xff0c;黑马官方教程视频里面老师没有讲这个&#xff0c;但是内容其实不难。只是按照之前的流程操作就行了。我把自己写好的代码分享给大家。做个参考demo。 第一步…

可用内存为什么可以超过实际内存

一、虚拟CPU和虚拟内存&#xff1a; 1、虚拟cpu&#xff1a; 利用进程机制&#xff0c;所有的现代操作系统都支持在同一时间来完成多个任务。尽管某个时刻&#xff0c;真实的CPU只能运行一个进程&#xff0c;但是从进程自己的角度来看&#xff0c;它会认为自己在独享CPU&…

安科瑞受邀参加2024年杭州建筑电气年会

24年7月4-5日&#xff0c;由杭州市土木建筑学会建筑电气专业委员会主办&#xff0c;中国联合工程有限公司&#xff0c;浙江省建设投资集团股份有限公司工程设计总院&#xff0c;大象建筑设计有限公司承办的2024年杭州建筑电气年会在杭州万华国际酒店隆重举办。杭州市各设计院所…