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

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容器的所有过滤器BeanFilter delegate = getFilterBean(someBeanName);// 执行过滤器Beandelegate.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 {@Nullableprivate String contextAttribute;@Nullableprivate WebApplicationContext webApplicationContext;@Nullableprivate String targetBeanName;private boolean targetFilterLifecycle;@Nullableprivate 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.mzph.cn/web/59546.shtml

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

相关文章

Android 项目依赖库无法找到的解决方案

目录 错误信息解析 解决方案 1. 检查依赖版本 2. 检查 Maven 仓库配置 3. 强制刷新 Gradle 缓存 4. 检查网络连接 5. 手动下载依赖 总结 相关推荐 最近&#xff0c;我在编译一个 Android 老项目时遇到了一个问题&#xff0c;错误信息显示无法找到 com.gyf.immersionba…

Vue全栈开发旅游网项目(11)-用户管理前端接口联调

联调基本步骤 1.阅读接口文档 2.配置接口地址 3.使用axios获取数据 4.将数据设置到模型层 1.发送验证码联调 1.1 配置接口地址 文件地址&#xff1a;src\utils\apis.js //系统相关的接口 const SystemApis {sliderListUrl:apiHost"/system/slider/list/",//发送…

320页PDF | 集团IT蓝图总体规划报告-德勤(限免下载)

一、前言 这份报告是集团IT蓝图总体规划报告-德勤。在报告中详细阐述了德勤为某集团制定的全面IT蓝图总体规划&#xff0c;包括了集团信息化目标蓝图、IT应用规划、数据规划、IT集成架构、IT基础设施规划以及IT治理体系规划等关键领域&#xff0c;旨在为集团未来的信息化发展提…

蓝桥杯c++算法学习【2】之搜索与查找(九宫格、穿越雷区、迷宫与陷阱、扫地机器人:::非常典型的必刷例题!!!)

别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01; 关注博主&#xff0c;更多蓝桥杯nice题目静待更新:) 搜索与查找 一、九宫格 【问题描述】 小明最近在教邻居家的小朋友小学奥数&#xff0c;而最近正好讲述到了三阶幻方这个部分&#xff0c;三 …

Springboot校园失物招领平台

Springboot校园失物招领平台 Springboot校园失物招领平台

C++(Qt)软件调试---符号转换工具cv2pdb (24)

C(Qt)软件调试—符号转换工具cv2pdb &#xff08;24&#xff09; 文章目录 C(Qt)软件调试---符号转换工具cv2pdb &#xff08;24&#xff09;[toc]1、概述&#x1f41c;2、下载cv2pdb&#x1fab2;3、qt程序使用cv2pdb&#x1f9a7;1.1 方法1&#xff1a;命令行1.2 方法2&#…

基于Java Springboot宠物流浪救助系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#xff1a;MySQL…

My_SQL day3

知识点&#xff1a;约束 1.dafault 默认约束 2.not null 非空约束 3.unique key 唯一约束 4.primary key 主键约束 5.anto_increment 自增长约束 6.foreign key 外键约束 知识点&#xff1a;表关系 1.一对一 2.一对多 3.多对多 知识点&#xff1a;约束 1.default 默认约束 …

C++基础:Pimpl设计模式的实现

2024/11/14: 在实现C17的Any类时偶然接触到了嵌套类的实现方法以及Pimpl设计模式&#xff0c;遂记录。 PIMPL &#xff08; Private Implementation 或 Pointer to Implementation &#xff09;是通过一个私有的成员指针&#xff0c;将指针所指向的类的内部实现数据进行隐藏。 …

Unity自动LOD工具AutoLOD Mesh Decimator的使用

最近在研究大批量物体生成&#xff0c;由于我们没有专业美术&#xff0c;在模型减面工作上没有人手&#xff0c;所以准备用插件来实现LOD功能&#xff0c;所以找到了AutoLOD Mesh Decimator这个插件。 1&#xff0c;导入插件后&#xff0c;我们拿个实验的僵尸狗来做实验。 空…

爬虫补环境案例---问财网(rpc,jsdom,代理,selenium)

目录 一.环境检测 1. 什么是环境检测 2.案例讲解 二 .吐环境脚本 1. 简介 2. 基础使用方法 3.数据返回 4. 完整代理使用 5. 代理封装 6. 封装所有使用方法 jsdom补环境 1. 环境安装 2. 基本使用 3. 添加参数形式 Selenium补环境 1. 简介 2.实战案例 1. 逆向目…

免费,WPS Office教育考试专用版

WPS Office教育考试专用版&#xff0c;不仅满足了考试需求&#xff0c;更为教育信息化注入新动力。 https://pan.quark.cn/s/609ef85ae6d4

Vue前端开发,组件及组件的使用

什么是组件 组件(Component)是Vue中最强大的功能之一&#xff0c;每个Vue 文件就是一个个独立的组件&#xff0c;组件也可以被其他组件调用&#xff0c;形成嵌套关系&#xff0c;大部分的应用都是由各类不同功能的小组件进行构建&#xff0c;形成一个功能强大的大组件树系统&a…

政务数据治理专栏开搞!

写在前面 忙忙碌碌干了一年政务数据治理的工作&#xff0c;从法人数据到自然人&#xff0c;从交通到地理信息等等&#xff0c;突发想法开一个专栏讲一讲政务数据遇到的问题&#xff0c;以及治理的成效&#xff0c;或许有朋友爱看。 政务数据&#xff0c;又称之为政务数据资源&a…

前端在PC端实现支付思路流程

一.去支付 1.前端点击“去支付”按钮&#xff0c;请求订单详情接口&#xff0c;传递订单的id、订单号给后端和请求支付方式接口 2.后端返回支付信息和支付方式数据 二.弹出支付窗口 接收支付信息和支付方式数据后&#xff0c;前端弹出支付弹窗 三.确认支付 前端无论选择任何…

VUE3实现好看的世界建筑中国建筑网站源码

文章目录 1.设计来源1.1 网站主界面1.2 登录界面1.3 注册界面1.4 特色建筑展览界面1.5 世界建筑介绍界面1.6 世界建筑介绍 - 详情界面1.7 中国建筑介绍界面1.8 中国建筑介绍 - 详情界面1.9 关于我们界面 2.效果和源码2.1 动态效果2.2 源代码2.3 目录结构 源码下载万套模板&…

「人眼视觉不再是视频消费的唯一形式」丨智能编解码和 AI 视频生成专场回顾@RTE2024

你是否想过&#xff0c;未来你看到的电影预告片、广告&#xff0c;甚至新闻报道&#xff0c;都可能完全由 AI 生成&#xff1f; 在人工智能迅猛发展的今天&#xff0c;视频技术正经历着一场前所未有的变革。从智能编解码到虚拟数字人&#xff0c;再到 AI 驱动的视频生成&#…

「QT」文件类 之 QTemporaryFile 临时文件类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制…

和 Nostr 探索 Web5 的未来

Nostr 是一个我过去两年一直在关注的协议。跟所有社区一样&#xff0c;Nostr 的发展也是起起伏伏&#xff0c;有过一些破圈被主流熟悉的时刻&#xff0c;也有一些像现在这样可能让人会觉得有点沉寂的时刻。但我还是经常关注 Nostr&#xff0c;没有特别的原因&#xff0c;就是单…

论文学习——一种基于决策变量分类的动态约束多目标进化算法

论文题目&#xff1a; A dynamic constrained multiobjective evolutionary algorithm based on decision variable classification 一种基于决策变量分类的动态约束多目标进化算法&#xff08;Yinan Guo a,b, Mingyi Huang a, Guoyu Chen a,*, Dunwei Gong c, Jing Liang d, …