责任链模式在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中,每个过滤器都实现了特定的安全功能,并且它们按照配置的顺序串联在一起,形成了一个过滤器链。
    • 当请求到达时,它首先被传递给链中的第一个过滤器。该过滤器会根据其逻辑判断是否需要处理该请求。如果需要,则进行处理;如果不需要或处理完成后需要继续传递,则将该请求传递给链中的下一个过滤器。
    • 这种机制允许每个过滤器专注于自己的安全功能,而无需关心其他过滤器的实现细节。同时,它也提供了更大的灵活性和可扩展性,因为可以通过添加、删除或重新排序过滤器来轻松地修改安全策略。
  • 关键过滤器的功能

    • UsernamePasswordAuthenticationFilter:用于处理基于用户名和密码的身份验证。它通常处理POST请求到/login端点。
    • SecurityContextPersistenceFilter:负责加载和保存SecurityContext。SecurityContext包含当前用户的安全上下文,如已认证的用户主体。
    • FilterSecurityInterceptor:执行访问决策。它根据配置的AccessDecisionManagerAccessDecisionVoter来决定用户是否有权访问某个资源。

三、自定义过滤器

在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能够灵活地处理各种安全需求,同时保持了代码的清晰和可维护性。

 

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

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

相关文章

mac上的建议xftp 工具

mac上的建议xftp 工具 最近使用mac比较频繁了,但是第一次重度使用mac里面有很多的工具都是新的,有的window版本的工具无法使用。 xftp 的平替 Cyberduck 从它的官网上下载是免费的,但是如果使用 Apple store 要花费198呢。这不就剩下一大笔…

异步编程中,为什么必须将conn放到后台连接

tokio::spawn(async move {if let Err(err) conn.await {let err_msg format!("Connection failed: {:?}", err);dbg!(err_msg);}});为什么不能是 if let Err(err) conn.await {let err_msg format!("Connection failed: {:?}", err);dbg!(err_msg);…

IC数字后端实现之大厂IC笔试真题(经典时序计算和时序分析题)

今天小编给大家分享下每年IC秋招春招必考题目——静态时序分析时序分析题。 数字IC后端笔试面试题库 | 经典时序Timing计算题 时序分析题1: 给定如下图所示的timing report,请回答一下几个问题。 1)这是一条setup还是hold的timing report?…

警钟长鸣,防微杜渐,遨游防爆手机如何护航安全生产?

近年来,携非防爆手机进入危险作业区引发爆炸的新闻屡见报端。2019年山西某化工公司火灾,2018年延安某煤业瓦斯爆炸,均因工人未用防爆手机产生静电打火引发。涉爆行业领域企业量大面广,相当一部分企业作业场所人员密集,…

MySQL 与 MongoDB 存储差异分析

MySQL 与 MongoDB 存储差异分析:为什么随机生成数据的存储空间不同? 在实际应用中,我们常常需要选择合适的数据库系统来处理不同类型的数据。在这个过程中,数据库的 存储机制 和 性能优化 起着至关重要的作用。对于很多开发者来说…

nginx和netcore加载常见的3D模型

背景 数字孪生带火了3D版的Web世界,3D模型格式也是众多,常见的glb适合web传输,fbx,gltf,obj,unity等常用于模型编辑和处理。我们在用netcore或者wasm加载这些3D模型文件时,一般都需要手工增加M…

mac 安装node提示 nvm install v14.21.3 failed可能存在问题

如果你在 macOS 上使用 nvm(Node Version Manager)安装 Node.js 版本 v14.21.3 时遇到安装失败的问题,可以按照以下步骤进行排查和解决: 1. 确认 nvm 安装是否正确 首先,确认你的 nvm 是否正确安装,并且能…

Mongo数据库 --- Mongo Pipeline

Mongo数据库 --- Mongo Pipeline 什么是Mongo PipelineMongo Pipeline常用的几个StageExplanation with example:MongoDB $matchMongoDB $projectMongoDB $groupMongoDB $unwindMongoDB $countMongoDB $addFields Some Query Examples在C#中使用Aggreagtion Pipeline**方法一: …

银行卡 OCR 识别 API 接口的发展前景

随着智能手机的广泛普及以及互联网的迅猛发展,“互联网 ” 时代的移动支付已然开启了智慧生活的崭新蓝图。移动支付要求进行实名认证并绑定银行卡,然而传统的手工输入银行卡号不但速度缓慢、容易出错,还极大地降低了用户体验。银行卡 OCR 识别…

华为OD机试真题---智能驾驶

华为OD机试中的“智能驾驶”题目是一道涉及广度优先搜索(BFS)算法运用的题目。以下是对该题目的详细解析: 一、题目描述 有一辆汽车需要从m * n的地图的左上角(起点)开往地图的右下角(终点)&a…

Redis与MySQL如何保证数据一致性

Redis与MySQL如何保证数据一致性 简单来说 该场景主要发生在读写并发进行时,才会发生数据不一致。 主要流程就是要么先操作缓存,要么先操作Redis,操作也分修改和删除。 一般修改要执行一系列业务代码,所以一般直接删除成本较低…

Linux宝塔部署wordpress网站更换服务器IP后无法访问管理后台和打开网站页面显示错乱

一、背景: wordpress网站搬家,更换服务器IP后,如果没有域名时,使用服务器IP地址无法访问管理后台和打开网站页面显示错乱。 二、解决方法如下: 1.wordpress搬家后,在新服务器上,新建站点时&am…

探秘嵌入式位运算:基础与高级技巧

目录 一、位运算基础知识 1.1. 位运算符 1.1.1. 与运算(&) 1.1.2. 或运算(|) 1.1.3. 异或运算(^) 1.1.4. 取反运算(~) 1.1.5. 双重按位取反运算符(~~&#xf…

MySQL底层概述—3.InnoDB线程模型

大纲 1.InnoDB的线程模型 2.IO Thread 3.Purge Thread 4.Page Cleaner Thread 5.Master Thread 1.InnoDB的线程模型 InnoDB存储引擎是多线程的模型,因此其后台有多个不同的后台线程,负责处理不同的任务。 后台线程的作用一:负责刷新内存…

充满智慧的埃塞俄比亚狼

非洲的青山 随着地球温度上升,贝尔山顶峰的冰川消失殆尽,许多野生动物移居到海拔3000米以上的高原上生活,其中就包括埃塞俄比亚狼。埃塞俄比亚狼是埃塞俄比亚特有的动物,总数不到500只,为“濒危”物种。 埃塞俄比亚狼…

pikachu平台xss漏洞详解

声明:文章只是起演示作用,所有涉及的网站和内容,仅供大家学习交流,如有任何违法行为,均和本人无关,切勿触碰法律底线 文章目录 概述:什么是xss一、反射型XSS1. get2. post 二、存储型XSS三、DOM…

Easyexcel(7-自定义样式)

相关文章链接 Easyexcel(1-注解使用)Easyexcel(2-文件读取)Easyexcel(3-文件导出)Easyexcel(4-模板文件)Easyexcel(5-自定义列宽)Easyexcel(6-单…

FFN层,全称为Feed-Forward Network层;Layer Normalization;Softmax;

目录 FFN层,全称为Feed-Forward Network层 Layer Normalization 操作步骤 归一化和Softmax 归一化解决量纲问题 归一化(Normalization) Softmax FFN层,全称为Feed-Forward Network层 是Transformer架构中的一个关键组件。它本质上是一个简单的多层感知机(MLP),用…

Android OTA 更新面试题及参考答案

目录 什么是 OTA 更新? 什么是 OTA 更新的主要目的? Android OTA 更新是如何与系统的分区机制相互配合的? 什么是 A/B 分区更新,它的优势是什么? Android 系统中的 “System Partition” 和 “Vendor Partition” 有什么区别? 请详细阐述 Android OTA 更新的基本原…

网络研讨会——如何使用Figma、Canva或Sketch设计Delphi移动应用程序

2024年11月30日星期六 - 北京午夜12点 如何使用Figma、Canva或Sketch设计Delphi移动应用程序 专业设计应用程序Figma、Sketch和Canva有大量优秀的应用程序设计等着你去实现。我们看看有什么可用的,并使用一些最好的设计来创建应用程序。。。 立即报名免费在线研讨会…