责任链模式在spring security过滤器链中的应用
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象按照顺序处理请求,并且每个对象可以选择自己是否处理该请求或将其传递给下一个对象。
在Spring Security中,责任链模式得到了广泛应用,特别是在其过滤器链(Filter Chain)机制中。
一、Spring Security过滤器链概述
Spring Security中的过滤器链是保护Web应用程序的核心组件之一。它是一条由多个过滤器组成的序列,这些过滤器按照特定顺序执行,用于处理HTTP请求和响应。每当客户端向应用程序发送请求时,请求首先会经过Spring Security的过滤器链。过滤器链中的过滤器会按顺序执行,每个过滤器都有机会处理请求和响应。如果过滤器允许请求继续,则请求会被转发到下一个过滤器或最终到达应用程序的控制器。
二、责任链模式在过滤器链中的应用
-
过滤器链的构成:
- Spring Security的过滤器链包含多种过滤器,如:
UsernamePasswordAuthenticationFilter
(用于处理基于用户名和密码的身份验证)、AbstractAuthenticationProcessingFilter
(抽象类,是大多数身份验证过滤器的基类)、SecurityContextPersistenceFilter
(负责加载和保存SecurityContext)、RememberMeAuthenticationFilter
(处理基于“记住我”功能的身份验证)、CsrfFilter
(处理跨站请求伪造保护)以及FilterSecurityInterceptor
(执行访问决策)等。
- Spring Security的过滤器链包含多种过滤器,如:
-
责任链模式的实现:
- 在Spring Security中,每个过滤器都实现了特定的安全功能,并且它们按照配置的顺序串联在一起,形成了一个过滤器链。
- 当请求到达时,它首先被传递给链中的第一个过滤器。该过滤器会根据其逻辑判断是否需要处理该请求。如果需要,则进行处理;如果不需要或处理完成后需要继续传递,则将该请求传递给链中的下一个过滤器。
- 这种机制允许每个过滤器专注于自己的安全功能,而无需关心其他过滤器的实现细节。同时,它也提供了更大的灵活性和可扩展性,因为可以通过添加、删除或重新排序过滤器来轻松地修改安全策略。
-
关键过滤器的功能:
UsernamePasswordAuthenticationFilter
:用于处理基于用户名和密码的身份验证。它通常处理POST请求到/login端点。SecurityContextPersistenceFilter
:负责加载和保存SecurityContext。SecurityContext包含当前用户的安全上下文,如已认证的用户主体。FilterSecurityInterceptor
:执行访问决策。它根据配置的AccessDecisionManager
和AccessDecisionVoter
来决定用户是否有权访问某个资源。
三、自定义过滤器
在Spring Security中,自定义过滤器的实现是责任链模式的一个典型应用。通过创建并注册自定义过滤器,你可以将特定的安全逻辑插入到过滤器链中,从而在请求处理过程中执行额外的操作。
以下是一个简单的示例,展示如何创建自定义过滤器并将其集成到Spring Security的过滤器链中。
假设我们需要创建一个自定义过滤器,用于记录每个请求的URI和HTTP方法。以下是如何实现这个自定义过滤器并将其添加到Spring Security的过滤器链中的步骤。
创建自定义过滤器
首先,你需要创建一个实现javax.servlet.Filter
接口的类。在这个类中,你将覆盖doFilter
方法以执行你的自定义逻辑。
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.Filter;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;public class CustomLoggingFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化逻辑(可选)}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;String uri = httpRequest.getRequestURI();String method = httpRequest.getMethod();// 记录请求的URI和HTTP方法System.out.println("Request URI: " + uri + ", Method: " + method);// 将请求传递给过滤器链中的下一个过滤器chain.doFilter(request, response);}@Overridepublic void destroy() {// 销毁逻辑(可选)}
}
注册自定义过滤器到Spring Security
接下来,你需要将自定义过滤器注册到Spring Security的过滤器链中。这通常是通过配置类来实现的。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.addFilterBefore(customLoggingFilter(), UsernamePasswordAuthenticationFilter.class)// 其他安全配置....authorizeRequests().anyRequest().authenticated().and().formLogin() // 如果使用表单登录,则启用它.and().httpBasic(); // 启用HTTP Basic(可选)return http.build();}@Beanpublic CustomLoggingFilter customLoggingFilter() {return new CustomLoggingFilter();}
}
在这个配置类中,我们使用了HttpSecurity
来配置Spring Security。通过调用addFilterBefore
方法,我们将自定义过滤器CustomLoggingFilter
添加到了UsernamePasswordAuthenticationFilter
之前。这意味着在身份验证之前,我们的自定义过滤器将首先执行并记录请求的URI和HTTP方法。
运行应用程序
现在,当你运行应用程序并发送请求时,你应该会在控制台中看到自定义过滤器记录的请求信息。
在Spring Security中每个过滤器(包括自定义过滤器)都是链中的一个节点,它们按照配置的顺序依次执行。每个过滤器都有机会处理请求,并且可以选择将请求传递给链中的下一个过滤器或执行其他操作(如拒绝访问、重定向等)。这种机制使得Spring Security能够灵活地处理各种安全需求,同时保持了代码的清晰和可维护性。
相关文章:
责任链模式在spring security过滤器链中的应用
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象按照顺序处理请求,并且每个对象可以选择自己是否处理该请求或将其传递给下一个对象。 在Spring Security中,责任链模式得到了广泛应…...
Netty基本原理
目录 前言 原生NIO VS Netty 原生NIO存在的问题 Netty的优点 线程模型 传统阻塞 I/O (Blocking I/O) 2. 非阻塞 I/O (Non-blocking I/O) 3. 多路复用 I/O (Multiplexed I/O) 4. Reactor 模式 常见的 Reactor 模式的变体: Netty线程模型 工作原理 前言 N…...
图论入门编程
卡码网刷题链接:98. 所有可达路径 一、题目简述 二、编程demo 方法①邻接矩阵 from collections import defaultdict #简历邻接矩阵 def build_graph(): n, m map(int,input().split()) graph [[0 for _ in range(n1)] for _ in range(n1)]for _ in range(m): …...
Haproxy
一、haproxy简介 HAProxy 是法国开发者 威利塔罗 (Willy Tarreau) 在 2000 年使用 C 语言开发的一个开源软件 是一款具备高并发 ( 万级以上 ) 、高性能的 TCP 和 HTTP 负载均衡器 支持基于 cookie 的持久性,自动故障切换,支持正则表达式及 web 状态统…...
旋转磁体产生的场 - 实验视频资源下载
先发几个视频,是2019年所作的实验内容 更多视频,到某宝找我吧。注意:是收费的。 20190312-180244-旋转磁体产生的场造成激光功率减小 https://download.csdn.net/download/u014161757/90038058 20190313-090956-旋转磁体产生的场对真空介电…...
Java Map
在Java的集合框架中,Map接口用于存储键值对,提供了一种基于键进行查找和操作的数据结构。Map接口的实现类提供了丰富的方法来操作键值对,例如添加、删除、更新和查找。本文将详细介绍Java中的Map接口及其常见实现类,包括HashMap、…...
长三角文博会:Adobe国际认证体系推动设计人才评价新标准
2024年11月22日,由上海、江苏、浙江、安徽三省一市党委宣传部共同发起的第五届长三角文化博览会(简称“长三角文博会”)在上海国家会展中心盛大启幕。长三角文博会自2018年起已成功举办多届,已成为展示区域文化产业发展成果、推动…...
GoogleTest做单元测试
目录 环境准备GoogleTest 环境准备 git clone https://github.com/google/googletest.git说cmkae版本过低了,解决方法 进到googletest中 cmake CMakeLists.txt make sudo make installls /usr/local/lib存在以下文件说明安装成功 中间出了个问题就是,…...
CSDN 博客自动发布脚本(Python 含自动登录、定时发布)
文章目录 关于 csdn auto publisher使用 关于 csdn auto publisher 源码地址:https://github.com/ezscode/csdn_auto_publisher 使用 def test_simple_pub():file_path /Users/xx/Documents/xxx/tool.md article Article(file_path) article.tags [python] art…...
RL78/G15 Fast Prototyping Board Arduino IDE 平台开发过程
这是一篇基于RL78/G15 Fast Prototyping Board的Arduino IDE开发记录 RL78/G15 Fast Prototyping Board硬件简介(背景)基础测试(方法说明/操作说明)开发环境搭建(方法说明/操作说明代码结果)Arduino IDE RL…...
VsCode 插件推荐(个人常用)
VsCode 插件推荐(个人常用)...
零基础学安全--云技术基础
目录 学习连接 前言 云技术历史 云服务 公有云服务商 云分类 基础设施即服务(IaaS) 平台即服务(PaaS) 软件即服务(SaaS) 云架构 虚拟化 容器 云架构设计 组件选择 基础设施即代码 集成部署…...
docker如何安装redis
第一步 如果未指定redis,则安装的是最新版的 docker pull redis 创建一个目录 mkdir /usr/local/docker/redis 然后直接可以下载redis,这是方式确实不怎么好,应该找在官网上找对应的redis配置文件 wget http://download.redis.io/redis-stab…...
搜维尔科技:仿人双臂遥操作系统,力反馈灵巧手操作解决方案
仿人双臂遥操作系统,力反馈灵巧手操作解决方案 搜维尔科技:仿人双臂遥操作系统,力反馈灵巧操作解决方案...
C++ 优先算法 —— 无重复字符的最长子串(滑动窗口)
目录 题目: 无重复字符的最长子串 1. 题目解析 2. 算法原理 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口(同向双指针) 3. 代码实现 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口 题目: 无重复字符的最长子串 1. 题目解析 题目截图: 此题所说的…...
R语言绘图过程中遇到图例的图块中出现字符“a“的解决方法
R语言绘图过程中遇到图例的图块中出现字符的解决方法 因为我遇到这个问题的时候没在网上找到合适的方法,找到个需要付费的,算了。也许是因为问的方式不同,问了半天AI也回答出来,莫名有些烦躁,打算对代码做个分析&…...
海康面阵、线阵、读码器及3D相机接线说明
为帮助用户快速了解和配置海康系列设备的接线方式,本文将针对海康面阵相机、线阵相机、读码器和3D相机的主要接口及接线方法进行全面整理和说明。 一、海康面阵相机接线说明 海康面阵相机使用6-pin P7接口,其功能设计包括电源输入、光耦隔离信号输入输出…...
Lua--1.基础知识
Lua基础知识 变量简单的4种变量类型复杂的4种变量类型type函数 字符串操作长度获取--#多行打印字符串拼接别的类型转字符串-- tostring()字符串提供的公共方法 运算符算术运算符-- - * / % ^条件运算符-- > < > < ~(不等于 是 ~)逻辑运算符-- and or not位运算、…...
从Full-Text Search全文检索到RAG检索增强
从Full-Text Search全文检索到RAG检索增强 时光飞逝,转眼间六年过去了,六年前铁蛋优化单表千万级数据查询性能的场景依然历历在目,铁蛋也从最开始做CRUD转行去了大数据平台开发,混迹包装开源的业务,机缘巧合下做了实时…...
Qt桌面应用开发 第八天(读写文件 文件编码 文件流)
目录 1.读文件 2.写文件及编码格式 2.1写文件 2.2编码格式 3.文件信息读取 4.文件流 4.1QTextStream 4.2QDataStream 1.读文件 需求:一个pushButton,点击之后可以选择一个txt文件的路径,路径会显示在lineEdit上,txt文件的…...
玩转 Burp Suite (1)
内容预览 ≧∀≦ゞ 玩转 Burp Suite (1)声明Burp Suite 简介Dashboard(仪表盘)1. 默认任务管理2. 暂停任务3. 新建扫描任务4. 使用总结 Target(目标)1. SIte Map (站点地图)2. Scope(范围&#…...
MyBatis高级扩展
一、Mapper批量映射优化: 1.需求: Mapper 配置文件很多时,在全局配置文件中一个一个注册太麻烦,希望有一个办法能够一劳永逸 2.配置方式: Mybatis允许在指定Mapper映射文件时,只指定其所在的包: <mappers><package name"c…...
蓝桥杯c++算法秒杀【6】之动态规划【下】(数字三角形、砝码称重(背包问题)、括号序列、异或三角:::非常典型的必刷例题!!!)
别忘了请点个赞收藏关注支持一下博主喵!!!! ! ! ! ! 关注博主,更多蓝桥杯nice题目静待更新:) 动态规划 三、括号序列 【问题描述】 给定一个括号序列,要求尽可能少地添加若干括号使得括号序列变得合…...
MR30分布式 IO 模块在冷却水泵系统中的卓越应用
在当今各类工业生产以及大型设施运行的场景中,冷却水泵系统起着至关重要的作用,它犹如保障整个运转体系顺畅运行的 “血液循环系统”,维持着设备适宜的温度环境,确保其稳定、高效地工作。而随着科技的不断发展,明达技术…...
微前端基础知识入门篇(二)
概述 在上一篇介绍了一些微前端的基础知识,详见微前端基础知识入门篇(一)。本文主要介绍qiankun微前端框架的实战入门内容。 qiankun微前端实践 通过Vite脚手架分别创建三个程序,主应用A为:vite+vue3+ts,两个微应用分别为B:vite+vue3+ts;C:vite+React+ts。因为qiankun的…...
直接抄作业!Air780E模组LuatOS开发:位运算(bit)示例
在嵌入式开发中,位运算是一种高效且常用的操作技巧。本文将介绍如何使用Air780E模组和LuatOS进行位运算,并通过示例代码帮助读者快速上手。 一、位运算概述 位运算是一种在计算机系统中对二进制数位进行操作的运算。由于计算机内部数据的存储和处理都是…...
从零开始理解JVM:对象的生命周期之对象销毁(垃圾回收)
一、JVM参数 在学垃圾回收器之前,我们先要知道,jvm参数是怎么回事。因为配置各种回收器,必须对应各种参数设置。 标准参数(-) 所有的JVM实现都必须实现这些参数的功能,而且向后兼容 -help-version 非标准参…...
计算机网络的发展
目录 起源与早期发展 ARPANET与TCP/IP协议的诞生 互联网的诞生与普及 高速互联网与无线网络的兴起 移动互联网与云计算的崛起 物联网、区块链与自动驾驶技术的兴起 起源与早期发展 计算机网络的雏形最早可以追溯到20世纪60年代,主要是为了共享大型计算资源。当…...
python3 自动更新的缓存类
这个类会在后台自动更新缓存数据,你只需要调用方法来获取数据即可。 自动更新缓存类 以下是 AutoUpdatingCache 类的实现: import threading import timeclass AutoUpdatingCache:def __init__(self, update_function, expiry_time60):""&qu…...
PICO 获取设备号 SN码
Unity版本 2020.3.42f1c1PICO SDK版本PICO Unity Integration SDK-3.0.5-20241105Pico设备pico 4ultra 注意 此api暂时只测试企业版本 pico 4ultra 代码 using Unity.XR.PICO.TOBSupport;private void Awake() {bool result PXR_Enterprise.InitEnterpriseService();Debug.L…...
spf算法、三类LSA、区间防环路机制/规则、虚连接
1.构建spf树: 路由器将自己作为最短路经树的树根根据Router-LSA和Network-LSA中的拓扑信息,依次将Cost值最小的路由器添加到SPF树中。路由器以Router ID或者DR标识。广播网络中DR和其所连接路由器的Cost值为0。SPF树中只有单向的最短路径,保证了OSPF区域内路由计管不…...
计算机基础(下)
内存管理 内存管理主要做了什么? 操作系统的内存管理非常重要,主要负责下面这些事情: 内存的分配与回收:对进程所需的内存进行分配和释放,malloc 函数:申请内存,free 函数:释放内存…...
OpenCV从入门到精通实战(七)——探索图像处理:自定义滤波与OpenCV卷积核
本文主要介绍如何使用Python和OpenCV库通过卷积操作来应用不同的图像滤波效果。主要分为几个步骤:图像的读取与处理、自定义卷积函数的实现、不同卷积核的应用,以及结果的展示。 卷积 在图像处理中,卷积是一种重要的操作,它通过…...
Java基础——(一)Java概述
Java特性 简单性:Java与C很相似,但剔除了C中许多比较复杂并且很少使用的功能,比如头文件、指针运算、结构、联合、操作符重载、虚基类等,从而使Java更易于上手、学习。面向对象:Java是一门面向对象语言,具…...
关于IDE的相关知识之三【插件安装、配置及推荐的意义】
成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于ide插件安装、配置及推荐意义的相关内容…...
C++设计模式之组合模式的基本结构
组合模式的UML类图表示如下: ------------------ ------------------ | Component | <----- | Leaf | ------------------ ------------------ | operation() | | operation() | ------------------ --…...
Apache OFBiz xmlrpc XXE漏洞(CVE-2018-8033)
目录 1、漏洞描述 2、EXP下载地址 3、EXP利用 1、漏洞描述 Apache OFBiz是一套企业资源计划(ERP)系统。它提供了广泛的功能,包括销售、采购、库存、财务、CRM等。 Apache OFBiz还具有灵活的架构和可扩展性,允许用户根据业务需求…...
梯度——多元函数偏导数——梯度算子的理论基础
梯度是一个数学概念,在多维空间中表示函数在某一点处变化最快的方向和变化率。 对于一个多元函数 f ( x 1 , x 2 , ⋯ , x n ) f(x_1, x_2, \cdots, x_n) f(x1,x2,⋯,xn),其梯度是一个向量,记作 ∇ f \nabla f ∇f或者 grad f f f&…...
【GPT】力量训练的底层原理?
详细解读力量训练的每一个底层原理 力量训练之所以有效,是因为它利用了肌肉、神经系统和生物化学反应的基本机制。以下逐一详细解析,并解释相关概念。 1. 应力-恢复-适应理论 概念解析 应力(Stress):指训练带来的负…...
Django 路由层
1. 路由基础概念 URLconf (URL 配置):Django 的路由系统是基于 urls.py 文件定义的。路径匹配:通过模式匹配 URL,并将请求传递给对应的视图处理函数。命名路由:每个路由可以定义一个名称,用于反向解析。 2. 基本路由配…...
Unity项目性能优化列表
1、对象池 2、检查内存是否泄露。内存持续上升(闭包、委托造成泄露) 3、检查DrawCall数量,尽量减少SetPassCall 4、尽量多的利用四种合批 动态合批(Dynamic Batching)静态合批(Static Batching)GPUInstancingSRP Batcher 动态合批消耗内存把多个网格组合在一起合并…...
docker启动kafka、zookeeper、kafdrop
1、启动zookeeper docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper2、启动kafka docker run -d --name kafka --publish 9092:9092 --link zookeeper:zookeeper -e KAFKA_BROKER_ID1 -e HOST_IP127.0.0.1 -e KAFKA_ZOOKEEPER_CONNECTzookeeper:2181…...
Pytest使用Jpype调用jar包报错:Windows fatal exception: access violation
问题描述 之前我们有讲过如何使用Jpype调用jar包,在成功调用jar包后,接着在Pytest框架下编写自动测试用例。但是在Pytest下使用Jpype加载jar包,并调用其中的方法会以下提示信息: 虽然提示信息显示有Windows显示致命…...
【AI赋能 Python编程】第十一章 Python技能提升指南:借助AI加速学习
AI赋能 Python编程-系列文章目录 第十一章 Python技能提升指南:借助AI加速学习 文章目录 AI赋能 Python编程-系列文章目录第十一章 Python技能提升指南:借助AI加速学习 前言明确学习目标基础入门指导进阶学习指导学习过程互动综合学习提示模板 前言 在…...
️ 爬虫开发中常见的性能优化策略有哪些?
在爬虫开发中,性能优化是确保爬虫稳定、高效运行的关键。以下是一些常见的性能优化策略,结合了搜索结果中的信息: 异步编程: 使用 asyncio 和 aiohttp 实现高并发,提高爬取效率。异步请求允许在等待一个请求完成的同时…...
Ubuntu安装不同版本的opencv,并任意切换使用
参考: opencv笔记:ubuntu安装opencv以及多版本共存 | 高深远的博客 https://zhuanlan.zhihu.com/p/604658181 安装不同版本opencv及共存、切换并验证。_pkg-config opencv --modversion-CSDN博客 Ubuntu下多版本OpenCV共存和切换_ubuntu20如同时安装o…...
《操作系统 - 清华大学》5 -4:虚拟技术
文章目录 0. 虚拟存储的定义1. 目标2.局部性原理3. 虚拟存储的思路与规则4. 虚拟存储的基本特征5. 虚拟页式存储管理5.1 页表表项5.2 示例 0. 虚拟存储的定义 1. 目标 虚拟内存管理技术,简称虚存技术。那为什么要虚存技术?在于前面覆盖和交换技术&#…...
网安瞭望台第5期 :7zip出现严重漏洞、识别网络钓鱼诈骗的方法分享
国内外要闻 7 - Zip存在高危漏洞,请立刻更新 2024 年 11 月 24 日,do son 报道了 7 - Zip 中存在的一个高严重性漏洞 CVE - 2024 - 11477。7 - Zip 是一款广受欢迎的文件压缩软件,而这个漏洞可能会让攻击者在存在漏洞的系统中执行恶意代码。…...
【JS】面试八股文
类型 JavaScript 有哪些数据类型,它们的区别? 答:JavaScript 共有八种数据类型, 分别是 Undefined、 Null、 Boolean、Number、String、Object、Symbol、BigInt。 其中 Symbol是ES6中新增的,BigInt 是 ES2020 中新增的。 Symbol 代表创建后独一无二且不可变的数据类型,…...
1、正则表达式
grep匹配 grep用来过滤文本内容,以匹配要查询的结果。 grep root /etc/passwd:匹配包含root的行 -m 数字:匹配几次后停止 -v:取反-i:忽略字符的大小写,默认的,可以不加-n:…...