(源码分析)springsecurity认证授权

了解

1. 结构总览

 SpringSecurity所解决的问题就是安全访问控制,而安全访问控制功能其实就是对所有进入系统的请求进行拦截,校验每个请求是否能够访问它所期望的资源。

根据前边知识的学习,可以通过Filter或AoP等技术来实现,SpringSecurity对web资源的保护是靠Filter实现的,所以从这个Filter来入手,逐步深入SpringSecurity 原理。当初始化SpringSecurity时,会创建一个名为SpringSecurityFilterChain的 Servlet过滤器,类型为org.springframework.security.web.FilterChainProxy,它实现了javax.servlet.Filter,因此外部的请求会经过此类,下图是 Spring Security过虑器链结构图:

 

上图说明:

FilterchainProxy是一个代理,真正起作用的是FilterChainProxy中securityFilterChain所包含的各个Filter,同时这些Filter作为Bean被Spring管理,它们是SpringSecurity核心,各有各的职责,但他们并不直接处理用户的认证,也不直接处理用户的授权,而是把它们交给了认证管理器AuthenticationManager决策管理器AccessDecisionManager。进行处理下图是 FilterChainProxy相关类的UML图示:

 2. 过滤器链中主要的几个过滤器及其作用

2.1 SecurityContextPersistenceFi1ter

这个Filter是整个拦截过程的入口和出口(也就是第一个和最后一个拦截器),会在请求开始时从配置好的 SecurityContextRepesitory中获取SecurityContext,然后把它设置给securityContextHolder。在请求完成后将SecurityContextHolder持有的SecurityContext再保存到配置好的SecurityContextRepository ,同时清除securityContextHolder所持有的SecurityContext。

2.2 UsernamePasswordAuthenticationFilter

用于处理来自表单提交的认证。该表单必须提供对应的用户名和密码,其内部还有登录成功或失败后进行处理的AuthenticationSuccessHandler和AuthenticationFailureHandler,这些都可以根据需求做相关改变。

2.3 FilterSecurityInterceptor

是用于保护web资源的,使用AccessDecisionManager对当前用户进行授权访问。

2.4 ExceptionTranslationFilter

能够捕获来自Filterchain所有的异常,并进行处理。但是它只会处理两类异常:AuthenticationException和 AccessDeniedException,其它的异常它会继续抛出。

3. Spring security 认证工作流程

3.1 认证流程图

 

查询数据库进行比对。

查询用户信息的代码--->UserDetailsService中loadUserByUsername该方法。 我们只需要重写该方法即可。

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

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

相关文章

天津仁爱学院2024级专升本新同学开学报到提示

亲爱的2024级新同学: 亲爱的仁爱新人,你准备好了吗?祝福之余,关于入学报到还有以下几点提示: 01报到时间 报到时间:2024年9月1日。报到时请携带录取通知书和准考证。因参军保留入学资格或因病及其他原因不能按时报到的同学&#x…

主图趋势交易九稳量化系统 期货指标公式大全 最准的期货指标源码 看期货涨跌最简单的方法文华财经指标公式源码

交易的动机必须来自于内心,一种解决问题的执着。在整个交易生涯的漫长岁月里,无法始终保持这种热忱。除非亲身体验,否则很难理解这种疯狂的热忱。这是一种高度的专注,其他一切好像都不存在,视野之内没有其他的东西。这…

利用Python进行高效数据分析实践

引言 在当今的数据驱动世界中,能够有效地处理和分析数据已成为许多行业的核心竞争力。Python作为一种强大的编程语言,因其简洁易读的语法以及丰富的第三方库支持,在数据科学领域受到了广泛的欢迎。本文将介绍如何使用Python进行高效的数据分…

前端系列-9 Vue3生命周期和computed和watch

背景 本文介绍Vue3的生命周期和钩子函数,鉴于篇幅允许以及防止前端文章过于分散,因此将watch和computed部分之前的学习笔记也整理到本文中。这三部分是三个知识点。watch可以与pinia的$subscribe状态监听进行比较学习。 1.组件生命周期 vue的每个组件…

探索 Milvus 存储系统:如何评估和优化 Milvus 存储性能

欢迎来到探索 Milvus 系列。Milvus 是一款支持水平扩展和具备出色性能的开源向量数据库。Milvus 的核心是其强大的存储系统,是数据持久化和存储的关键基础。该系统包括几个关键组成部分:元数据存储(meta storage)、消息存储&#…

bugku-web-source

kali中先用dirsearch工具扫描后台目录,然后用wget -r url/.git命令递归下载后,进入txt文件使用git reflog命令然后只用git show查看作者提交flag日志,用git show 一个一个去尝试,很多假的flag git reflog 是一个 Git 命令&#x…

【Golang】清理Markdown未引用图片

概述 本文介绍一个使用Go语言编写的脚本,其功能是清理指定目录中未被Markdown文件引用的图片。该脚本通过读取Markdown文件中的图片引用,与存储在特定目录下的所有图片进行对比,将未引用的图片移动到另一个指定的目录中。此脚本适用于需要维护…

苹果电脑怎么使用Windows软件 苹果笔记本怎么安装Windows mac怎么安装windows

最早的苹果电脑的概念是在1976年的时候由乔布斯提出来的,在1977年的时候发行的第一款个人电脑,也就是苹果笔记本电脑。苹果笔记本的操作系统是MAC OSmac OS是基于unix内核的系统,这个系统是专门为苹果电脑开发的。macOS比windows的视觉冲击大…

Synchronized的锁升级过程是怎样的?

文章目录 一、Synchronized的使用1、修饰实例方法2、修饰静态方法3、修饰代码块4、总结: 二、Monitor1、Java对象头1.1 32 位虚拟机的对象头1.2 64位虚拟机的对象头 2、Mark Word 结构3、Moniter4、Synchronized 字节码5、轻量级锁6、锁膨胀7、自旋优化8、偏向锁9、…

Laravel Sanctum:简化无状态API认证的新纪元

Laravel Sanctum:简化无状态API认证的新纪元 在现代Web应用中,API的安全认证是一个核心需求。Laravel Sanctum是一个轻量级的认证解决方案,专为Laravel开发的单页应用(SPA)、移动应用和API而生。它提供了一种简单而灵…

C++ 代码实现局域网即时通信功能 (windows 系统 客户端)

本项目使用C实现具备多个客户端和服务器端即时通信聊天功能软件 一:项目内容 使用C实现一个具备多客户端和一个服务器端即时通信功能的聊天软件。 本项目的目的是 学习在windows平台下,进行C网络开发的基本概念:TCP/IP socket通信&#xff0…

【diffusers极速入门(五)】扩散模型中的 Scheduler(noise_scheduler)的作用是什么?

系列文章目录 【diffusers 极速入门(一)】pipeline 实际调用的是什么? call 方法!【diffusers 极速入门(二)】如何得到扩散去噪的中间结果?Pipeline callbacks 管道回调函数【diffusers极速入门&#xff0…

Vue中!.和?.是什么意思

在Vue(或更广泛地说,在JavaScript和TypeScript中),!. 和 ?. 是两个与可选链(Optional Chaining)和断言非空(Non-null Assertion)相关的操作符,它们分别用于处理可能为nu…

Java集合之HashMap的数据结构分析

总所周知,Java中键值对集合,我们最常用的就是HashMap,那么它的数据结构,以及如何存储键值对,包括为什么使用红黑树,链表等许多数据结构,下面我们一起学习交流 1.HashMap的数据结构:…

scratch二次开发:如何修改toolbox宽度

大家好,我是小黄。 使用场景:有时候我们开发图形化编程时,我们的积木块很长,导致一部分无法显示,我们想要把目录区域位置放大,比如下面红色方框区域位置,那么改如何实现这个过程呢?…

代码随想录 Day27 || 455分发饼干 376摆动序列 53最大子数组和

关于贪心算法(摘自hello算法) 贪心算法(greedy algorithm)是一种常见的解决优化问题的算法,其基本思想是在问题的每个决策阶段,都选择当前看起来最优的选择,即贪心地做出局部最优的决策&#x…

Qt,获取其他.exe文件的标准输出流的信息(printf/print的输出信息)

比如,通过Python编写爬虫软件功能是运行程序获取豆瓣电影排行榜信息,并通过print打印出来。将其打包成.exe,通过Qt来调用,并获取到.exe程序运行的结果 简单示例代码: // 创建 QProcess 对象QProcess process;// 连接信号槽以获取…

【机器学习】机器学习的基本概念、算法的工作原理、实际应用案例

一、机器学习的基本概念 定义: 机器学习是人工智能的一个分支,它使计算机能够在没有明确编程的情况下从数据中学习并改进其性能。机器学习的目标是让计算机自动学习模式和规律,从而能够对未知数据做出预测或决策。 主要类型: 监…

嵌入式学习Day14---C语言进阶

目录 一、构造类型 1.1.结构体 1.存储 2.输入输出(传参) 3.结构体数组 1.2.共同体(联合体) 1.格式 2.存储 3.测试一个平台是打端还是小端 1.3.枚举 1.格式 2.特点 二、位运算(操作二进制) 2.1.&a…

培训第十六天(web服务apache与nginx)

上午 静态资源 根据开发者保存在项目资源目录中的路径访问静态资源html 图片 js css 音乐 视频 f12,开发者工具,网络 1、web基本概念 web服务器(web server):也称HTTP服务器(HTTP server)&am…