认证鉴权框架SpringSecurity-1--概念和原理篇

news2024/12/23 13:06:23

1、基本概念

Spring Security 是一个强大且高度可定制的框架,用于构建安全的 Java 应用程序。它是 Spring 生态系统的一部分,提供了全面的安全解决方案,包括认证、授权、CSRF防护、会话管理等功能。

2、认证、授权和鉴权

(1)、认证

认证是判断一个用户的身份是否合法的过程。用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问,不合法则拒绝访问。常见的用户身份认证方式有:用户名密码登录,二维码登录,手机短信登录,指纹认证等方式。

(2)、授权

授权是对系统中的用户赋予资源访问权限的过程,通常分为菜单权限,静态资源权限,接口权限等。

(3)、鉴权

授权是用户认证通过后,根据用户的权限来控制用户访问资源的过程,拥有资源的访问权限则正常访问,没有权限则拒绝访问。

3、实现原理

SpringSecurity通过实现一组过滤器来完成安全工作。这些过滤器按顺序处理请求。每个过滤器负责特定的安全任务。这里先简单阐述下主要工作流程,过滤器链在后面会详细描述。

(1)、经典web请求过滤器链

当客户端向服务端发起请求后,容器根据请求 URI 的路径和过滤器相关配置自动创建一个 FilterChain,其中包含过滤器实例和处理 HttpServletRequest 的 Servlet。类似如下图:
在这里插入图片描述
当过滤器执行放行后,才会进入到下一个过滤器中,所以调用每个 Filter 的顺序非常重要。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
    // 进入servelt前,执行
    chain.doFilter(request, response); 
    // 执行完servlet后,返回客户端时执行
}

(2)、spring加入过滤器链

当我们使用spring框架时,通过spring也可以加入自定义过滤器,那么spring是怎么做的呢?
答案是:
Spring 提供了一个名为 DelegatingFilterProxy 的过滤器代理类添加到了web请求的过滤器链中(DelegatingFilterProxy 就是一个过滤器)。在这个过滤器中spring做了以下事情:
1、获取到了自身spring容器内的所有Filter的实例(自定义的Filter也是作为Bean被spring容器管理)
2、依次执行了这些过滤器,直到全部执行完成后才放行到web过滤器链中的下一个过滤器或servlet中,这样spring自身的过滤器就都生效了。
在这里插入图片描述
DelegatingFilterProxy 代码示例如下:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
    // 获取spring容器的所有过滤器Bean
	Filter delegate = getFilterBean(someBeanName);
    // 执行过滤器Bean
	delegate.doFilter(request, response);
}

(3)、springSecurity加入过滤器链

上面我们说了spring通过DelegatingFilterProxy代理过滤器成功加入到web过滤器链中。
springSecurity作为spring家族的一员,自身封装了一组过滤器链的实例(用于认证和授权)。
在DelegatingFilterProxy有一个属性Bean叫FilterChainProxy ,FilterChainProxy 是 Spring Security 提供的一个特殊过滤器,它允许通过 SecurityFilterChain 向多个过滤器实例委托。
在这里插入图片描述
FilterChainProxy在DelegatingFilterProxy中封装获取。看下DelegatingFilterProxy源码,如下所示,这里的delegate实际上就是FilterChainProxy对象,

public class DelegatingFilterProxy extends GenericFilterBean {
    @Nullable
    private String contextAttribute;
    @Nullable
    private WebApplicationContext webApplicationContext;
    @Nullable
    private String targetBeanName;
    private boolean targetFilterLifecycle;
    @Nullable
    private volatile Filter delegate;  // FilterChainProxy就在这里
    private final Object delegateMonitor;
    //省略...
}

再看下FilterChainProxy 源码,发现其中就包含一组过滤器链SecurityFilterChain对象。就是这里,springSecurityFilterChain就上场了。

public class FilterChainProxy extends GenericFilterBean {
	private static final Log logger = LogFactory.getLog(FilterChainProxy.class);
	private final static String FILTER_APPLIED = FilterChainProxy.class.getName().concat(
			".APPLIED");
    private List<SecurityFilterChain> filterChains;    // SecurityFilterChain 对象列表
    //省略...
}

在这里插入图片描述
FilterChainProxy 中List 来确定应该为当前请求调用哪一个 SpringSecurityFilterChain 实例。在选择过滤器链时,在FilterChainProxy 中是这样做的:
逻辑:
1、SecurityFilterChain(接口) -> DefaultSecurityFilterChain(实现类),里面有一个getFilters方法,这里就会根据请求返回了一组过滤器 。
2、RequestMatcher接口用来支持匹配HttpServletRequest的策略。匹配策略有很多,此处不多介绍。
3、RequestMatcher -> AntPathRequestMatcher(实现),servlet通过url路径进行匹配 。

private List<Filter> getFilters(HttpServletRequest request) {
		for (SecurityFilterChain chain : filterChains) {
			if (chain.matches(request)) {   // 根据请求类型选择出不同过滤器链
				return chain.getFilters();
			}
		}
		return null;
	}

(4)、异常处理机制

概述:
SpringSecurity的过滤器链中,有一个ExceptionTranslationFilter,这个过滤器会捕获所有与安全相关的异常,并根据异常类型进行相应的处理。常见的安全异常包括:
AuthenticationException:表示认证失败。
AccessDeniedException:表示授权失败,即用户没有权限访问某个资源。
如果是AuthenticationException:
第一步:首先清除 SecurityContextHolder,这个是一个 Spring Security 中的一个核心类。
第二步:RequestCache:保存 HttpServletRequest 请求,在身份验证成功后可以使用它重复原始请求。//也可以不保存,那么用户就需要重新去请求
第三步、AuthenticationEntryPoint 用于从客户端获取请求凭据。// 它可能重定向到登录页面或发送 WWW-Authenticate 报文头。
如果是AccessDeniedException
则拒绝访问。直接调用 AccessDeniedHandler 来处理拒绝访问。// AccessDeniedHandler(接口),也可以自定义处理策略
在这里插入图片描述
这里看下ExceptionTranslationFilter的伪代码如下:
如果没有发生任何异常,ExceptionTranslationFilter过滤器直接放行到之后的过滤器;如果发生了安全异常,会根据异常类型走不同的方法,如认证异常(一般重新跳转登录页);如果是权限异常(提示相关的拒绝信息)

try {
	filterChain.doFilter(request, response);
} catch (AccessDeniedException | AuthenticationException ex) { //捕获特定异常
	if (!authenticated || ex instanceof AuthenticationException) {
		startAuthentication(); //启动认证流程
	} else {
		accessDenied(); //决绝策略
	}
}

(5)、原理总结

1、spring通过将DelegatingFilterProxy过滤器链加入到web请求过滤器链中。
2、DelegatingFilterProxy中封装了FilterChainProxy过滤器对象(springSecurity入口)
3、FilterChainProxy中封装了List过滤器链对象。
4、List初始过程会调用getFilters方法获取到目标过滤器链(策略是根据Request对象的URL)
5、之后会遍历执行List过滤器链,执行里面的每一个过滤器,完成认证或授权等过程。
6、如果出现安全异常,ExceptionTranslationFilter中会根据异常的类型走对应的异常处理方法。
在这里插入图片描述

学海无涯苦作舟!!!

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

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

相关文章

动态规划一>子数组系列

题目&#xff1a; 2.解析&#xff1a; 代码&#xff1a; public int maxSubArray(int[] nums) {int n nums.length;int[] dp new int[n 1];int ret Integer.MIN_VALUE;for(int i 1; i < n; i){dp[i] Math.max(nums[i - 1], dp[i - 1] nums[i - 1]);ret Math.max(…

ctfshow DSBCTF web部分wp

ctfshow 单身杯 web部分wp web 签到好玩的PHP 源码&#xff1a; <?php error_reporting(0); highlight_file(__FILE__);class ctfshow {private $d ;private $s ;private $b ;private $ctf ;public function __destruct() {$this->d (string)$this->d;$this…

【How AI Works】读书笔记2 出发吧! AI纵览 第一部分

目录 1.说明 2.第一部分(P5~P8) 如何控制几乎所有计算机的方式 三个计算机的先驱人物 AI,机器学习和深度学习之间的关系 机器学习的介绍 深度学习的介绍 AI的介绍 模型 3.单词 4.专业术语 1.说明 书全名:How AI Works From Sorcery to Science 作者 Ronald T.Kneus…

MQ集群

目录 MQ集群 集群分类 普通集群 集群结构和特征 集群的部署 获取cookie 准备集群配置 启动集群 镜像模式 镜像模式的特征 镜像模式的配置 exactly模式 仲裁队列 集群特征仲裁队列&#xff1a;仲裁队列是3.8版本以后才有的新功能&#xff0c;用来替代镜像队列&#…

【excel】easy excel如何导出动态列

动态也有多重含义&#xff1a;本文将描述两种动态场景下的解决方案 场景一&#xff1a;例如表头第一列固定为动物&#xff0c;且必定有第二列&#xff0c;第二列的表头可能为猫 也可能为狗&#xff1b;这是列数固定&#xff0c;列名不固定的场景&#xff1b; 场景二&#xff1…

P10901 [蓝桥杯 2024 省 C] 封闭图形个数

铁子们好呀&#xff0c;今天博主给大家更新一道编程题&#xff01;&#xff01;&#xff01; 题目链接如下&#xff1a; P10901 [蓝桥杯 2024 省 C] 封闭图形个数 好&#xff0c;接下来&#xff0c;我将从三个方面讲解这道例题。分别是 题目解析算法原理代码实现 文章目录 1.题…

【深度学习】神经网络优化方法 正则化方法 价格分类案例

神经网络优化方法 正则化方法 价格分类案例 梯度下降法 ​ 梯度下降法是一种寻找损失函数最小的方法,从数学上的角度来看&#xff0c;梯度的方向是函数增长速度最快的方向&#xff0c;那么梯度的反方向就是函数减少最快的方向&#xff0c;所以有&#xff1a; 其中&#xff0c…

UE5 umg学习(四) 将UI控件显示到关卡中

视频资料 7、将UI控件渲染到关卡_哔哩哔哩_bilibili 在前三节里&#xff0c;创建了用户的控件蓝图Widget_BP 目标是运行的时候&#xff0c;开始运行这个蓝图&#xff0c;因此需要在开始事件触发运行 首先&#xff0c;回到主页&#xff0c;点击关卡蓝图 要从事件开始运行时 …

数字图像处理(c++ opencv):图像复原与重建-常见的滤波方法--自适应滤波器

自适应局部降噪滤波器 自适应局部降噪滤波器&#xff08;Adaptive, Local Noise Reduction Filter&#xff09;原理步骤 步骤 &#xff08;1&#xff09;计算噪声图像的方差 &#xff1b; &#xff08;2&#xff09;计算滤波器窗口内像素的均值 和方差 &#xff1b; &…

websocket身份验证

websocket身份验证 前言 上一集我们就完成了websocket初始化的任务&#xff0c;那么我们完成这个内容之后就应该完成一个任务&#xff0c;当客户端与服务端连接成功之后&#xff0c;客户端应该主动发起一个身份认证的消息。 身份认证proto 我们看一眼proto文件的内容。 我…

鸿蒙HarmonyOS 地图不显示解决方案

基于地图的开发准备已完成的情况下&#xff0c;地图还不显式的问题 首先要获取设备uuid 获取设备uuid 安装DevEco Studio的路径下 有集成好的hdc工具 E:\install_tools\DevEco Studio\sdk\default\openharmony\toolchains 这个路径下打开cmd运行 进入“设置 > 关于手机…

Day44 | 动态规划 :状态机DP 买卖股票的最佳时机IV买卖股票的最佳时机III

Day44 | 动态规划 &#xff1a;状态机DP 买卖股票的最佳时机IV&&买卖股票的最佳时机III&&309.买卖股票的最佳时机含冷冻期 动态规划应该如何学习&#xff1f;-CSDN博客 本次题解参考自灵神的做法&#xff0c;大家也多多支持灵神的题解 买卖股票的最佳时机【…

PySpark——Python与大数据

一、Spark 与 PySpark Apache Spark 是用于大规模数据&#xff08; large-scala data &#xff09;处理的统一&#xff08; unified &#xff09;分析引擎。简单来说&#xff0c; Spark 是一款分布式的计算框架&#xff0c;用于调度成百上千的服务器集群&#xff0c;计算 TB 、…

<项目代码>YOLOv8 番茄识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

MySQL技巧之跨服务器数据查询:基础篇-动态参数

MySQL技巧之跨服务器数据查询&#xff1a;基础篇-动态参数 上一篇已经描述&#xff1a;借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的连接名: MY_ODBC_MYSQL 以及用同样的方法&a…

三天精通一种算法之螺旋矩阵(设计思路),长度最小子数组(滑动窗口)

这题主要考察思维 我来一一解释这串代码 var generateMatrix function(n) { const matrix Array.from({ length: n }, () > Array(n).fill(0)); let top 0, bottom n - 1; let left 0, right n - 1; var num 1; while (num < n * n) { …

2024-11-13 Unity Addressables1——概述与导入

文章目录 1 概述1.1 介绍1.2 主要作用1.3 Addressables 与 AssetBundle 的区别 2 导入3 配置3.1 方法一3.2 方法二 1 概述 1.1 介绍 ​ Addressables 是可寻址资源管理系统。 ​ Unity 从 2018.2 版本开始&#xff0c;建议用于替代 AssetBundle 的高阶资源管理系统。在 Unit…

python爬虫实战案例——爬取A站视频,m3u8格式视频抓取(内含完整代码!)

1、任务目标 目标网站&#xff1a;A站视频&#xff08;https://www.acfun.cn/v/ac40795151&#xff09; 要求&#xff1a;抓取该网址下的视频&#xff0c;将其存入本地&#xff0c;视频如下&#xff1a; 2、网页分析 进入目标网站&#xff0c;打开开发者模式&#xff0c;我们发…

web实验3:虚拟主机基于不同端口、目录、IP、域名访问不同页面

创建配置文件&#xff1a; 创建那几个目录及文件&#xff0c;并且写内容&#xff1a; 为网卡ens160添加一个 IPv4 地址192.168.234.199/24: 再重新激活一下网卡ens160&#xff1a; 重启服务&#xff1a; 关闭防火墙、改宽松模式&#xff1a; 查看nginx端口监听情况&#xff1a;…

在tiktok开店,商家可以享受到多少显著的优势?

短视频带货正在蓬勃发展&#xff0c;因此&#xff0c;许多人开始利用自媒体平台进行商品销售。越来越多的商家选择在TikTok上开设店铺。那么&#xff0c;在TikTok上开店&#xff0c;商家可以享受到哪些显著的优势呢&#xff1f; 1. 庞大的用户基础 TikTok拥有海量的用户群体&…