责任链模式在spring security过滤器链中的应用

Spring Security架构中过滤器的实现 Spring Security过滤器机制详解:从基础到自定义实现。文章系统梳理了过滤器链工作原理,包括Jakarta EE规范变更后的接口路径调整。重点解析了内置过滤器(如BasicAuthenticationFilter、CsrfFilter)的功能与配置方式,以及通过order值控制执行顺序的机制。最后详细演示了自定义过滤器的开发过程,展示如何实现请求头校验等安全逻辑。全文涵盖过滤器链的动态特性、典型配置模式及深度定制方法,为构建灵活的安全方案提供实践指导。 阅读详情

责任链模式(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:执行访问决策。它根据配置的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 {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化逻辑(可选)
    }

    @Override
    public 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);
    }

    @Override
    public 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 {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .addFilterBefore(customLoggingFilter(), UsernamePasswordAuthenticationFilter.class)
            // 其他安全配置...
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .formLogin() // 如果使用表单登录,则启用它
            .and()
            .httpBasic(); // 启用HTTP Basic(可选)

        return http.build();
    }

    @Bean
    public CustomLoggingFilter customLoggingFilter() {
        return new CustomLoggingFilter();
    }
}

在这个配置类中,我们使用了HttpSecurity来配置Spring Security。通过调用addFilterBefore方法,我们将自定义过滤器CustomLoggingFilter添加到了UsernamePasswordAuthenticationFilter之前。这意味着在身份验证之前,我们的自定义过滤器将首先执行并记录请求的URI和HTTP方法。

运行应用程序

现在,当你运行应用程序并发送请求时,你应该会在控制台中看到自定义过滤器记录的请求信息。

 

在Spring Security中每个过滤器(包括自定义过滤器)都是链中的一个节点,它们按照配置的顺序依次执行。每个过滤器都有机会处理请求,并且可以选择将请求传递给链中的下一个过滤器或执行其他操作(如拒绝访问、重定向等)。这种机制使得Spring Security能够灵活地处理各种安全需求,同时保持了代码的清晰和可维护性。

 

Spring Security框架全面解析与应用实践 摘要: Spring Security的核心架构基于Servlet过滤器链,通过DelegatingFilterProxy和FilterChainProxy实现安全处理。它支持多种客户端类型,提供CSRF防护、基础认证等内置功能,并允许细粒度安全配置。Spring Boot集成后自动配置默认安全规则,包括随机密码生成和BCrypt加密。核心过滤器如CsrfFilter、BasicAuthenticationFilter和AuthorizationFilter分别处理跨站防护、认证与授权流程。开发者可通过Ht 阅读详情

相关推荐

【一线大厂Java面试题合集】第77篇-结构型与行为型设计模式

代理 / 装饰器 / 适配器的区别和框架应用责任链模式在 Spring 拦截器链、Filter 链中的运用策略模式消除 if-else 的实战重构手法观察者 / 模板方法 / 迭代器的标准写法和框架映射JDK / Spring 源码中的设计模式具体应用面试时做到"能写代码、能讲原理、能举框架实例",即可获得高分。

gaochufukanyongren的博客 14

SpringSecurity过滤器链

SpringSecurity过滤器链

qq_53318060的博客 2717

11 CO配置-控制-成本中心会计-定义分割结构(OKES-Define Splitting Structure)

业务背景:定义分割结构 事务码: OKES SPRO路径:SPRO->控制->成本中心会计->实际过账->期末结算->作业分配->划分->定义分割结构 第1步,SPRO路径进入 第2步,选择“新的条目”创建 分割结构 第3步,选择分割结构代码 点击“分割规则”进行下一个界面,点击“新条目”创建 分割结构规则 第4步,点击“为规则选择” 为分割结构规则创建版本并保存 第5步,选择“分配”,点击“新的条目” 输入分割结构分配

4371

Spring Security漏洞防护—HTTP 安全响应头

Spring Security漏洞防护—HTTP 安全响应头

深圳市多克创新科技有限公司 3159

传感器融合的智能演进:ST-MC-Workbench中霍尔与编码器的协同控制策略

本文探讨了ST-MC-Workbench中霍尔传感器与编码器的协同控制策略,通过传感器融合技术提升电机控制精度。文章详细介绍了分层处理架构、霍尔安装角度优化及编码器Z脉冲容错机制,展示了在新能源汽车和工业应用中的实际效果,为高精度位置检测提供了解决方案。

weixin_29159441的博客 482

淘宝x-mini-wua生成机制与硬件信息关联性深度解析

本文深度解析了淘宝x-mini-wua的生成机制与硬件信息的关联性,详细介绍了其作为设备指纹令牌的核心作用及技术实现细节。通过分析基础硬件层、环境特征层和行为特征层的数据采集,揭示了淘宝如何利用AES加密和分级加密策略防止破解,并探讨了其安全防护与对抗策略。

weixin_29243279的博客 230

深入理解Spring Security之过滤器责任链模式分析

Spirng Security的核心思路就是采用了责任链模式通过一系列的Filter来实现权限控制(关于责任链模式前面有过简单的介绍[责任链模式](https://liyongzhi.blog.youkuaiyun.com/article/details/90741924))。这篇文章主要分析了Spring-Security中怎么生成和使用过滤器链的。

李永志的博客 1267

车底盘:阿克曼转向和四轮差速

特性四轮差速四轮转向阿克曼转向转向方式控制左右轮组速度差控制四个轮子的角度控制前轮角度(后轮固定)运动原理滑移摩擦(搓着走)纯滚动(滚着走)近乎纯滚动(低速时)能耗高低(实现纯滚动时)中轮胎磨损非常严重小中灵活性高(可原地旋转)极高(可全向移动)低(转弯半径大)控制精度较低(受地面摩擦影响大)极高高机械复杂度低(通常只需2个驱动电机)极高(需4个转向+4个驱动执行器)中(需1个转向+2个驱动执行器)典型应用坦克、履带车辆、简单AGV、扫地机器人豪华轿车、高性能全向AGV。

bing_feilong的博客 1926

Spring Security认证:获得认证、持久化认证模块详解

目前包含获得认证模块详解与源码解析、持久化认证模块详解。

lifetime_gear的博客 1419

从零实现Unitree Go2的SLAM建图与导航:手把手集成slam_toolbox和nav2(附Rviz2可视化配置)

本文详细指导如何在Unitree Go2四足机器人上集成slam_toolbox和nav2,实现SLAM建图与导航功能。从ROS2环境配置、雷达数据处理到slam_toolbox参数优化,再到nav2路径规划与Rviz2可视化调试,提供完整解决方案。特别适合机器人开发者快速掌握ROS2导航栈在Unitree Go2上的应用实践。

weixin_33737134的博客 1232

芯片详解——AD7606

AD7606详解

weixin_45661757的博客 5021

Spring Security 5.7.1安全过滤器链配置方法

@RequiredArgsConstructor(onConstructor_ = @Autowired) @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class WebSecurityConfiguration { @NonNull private AuthenticationSuccessHandler authenticationSuccessHandler; @NonNull p.

DDDInJava 4285

零基础入门篇③ PyCharm使用指南(个性化设置、开发必备插件、常用快捷键)

Python从入门到精通👉零基础入门篇③

hacker707的博客 4375

责任链模式实战:干掉 200 行 if-else,从 Spring Security 过滤器到企业级订单审核

重构订单审核系统:用责任链模式解耦复杂逻辑 摘要:本文分享了如何用责任链模式重构臃肿的订单审核系统。原系统包含200多行if-else判断逻辑,维护困难。通过责任链模式将每个审核条件拆分为独立处理器节点,实现了: 高度解耦 - 新增/删除/调整审核环节只需修改单个类或配置 灵活扩展 - 大促活动审核只需新增处理器类并插入链中 易于测试 - 每个处理器可单独测试 清晰维护 - 避免意大利面条式代码 文章详细讲解了纯/不纯责任链的区别,并通过青铜版(请假审批)和王者版(企业级订单审核)两个代码示例,演示了从基础

分享 AI Agent、大模型与后端开发实战; 空门技术栈。 376

GJB设计开发各阶段的文件和记录要求

GJB设计开发各阶段的文件和记录要求

Abel的博客 4055

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

23种设计模式详解及其在Spring中的应用

【代码】23种设计模式详解及其在Spring中的应用。

花千树的专栏 1099

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

设计模式-责任链模式详解

责任链模式是一种行为型设计模式,它通过将多个处理对象连接成链,使请求能够沿着这条链传递,直到被某个对象处理。核心思想是解耦请求发送者和接收者,支持动态配置处理流程。模式包含抽象处理者、具体处理者和客户端三个角色,通过链式调用实现请求处理。Spring框架中的拦截器、过滤器等机制都采用了责任链模式。其优势在于灵活性和可扩展性,但需要注意处理链的管理和性能优化。典型应用场景包括审批流程、日志处理和权限验证等系统。

new_daimond的博客 1300

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【设计模式】行为型模式—责任链模式(Chain of Responsibility Pattern)(十五)

**责任链模式(Chain of Responsibility Pattern)是指将链中的每一个节点看作是一个对象,每个节点处理的请求均不同,且每个节点内部自动维护了一个下一个节点对象。当一个请求在链路的头部发出时,会沿着链的路径依次传递给每一个节点对象,直到有对象处理这个请求为止。** - 责任链模式通常会维护一个`单向链表`,将同一类请求的对象连成一条链,调用方只需要调用`头部节点`就可以了,所提交的请求会沿着`链传递`,由链上的对象逐个判断`是否有能力处理该请求`,如果能则处理,`如果不能则传递给链

墩墩分墩 444

Dante Cloud责任链模式:请求处理链的灵活配置与管理

Dante Cloud作为国内首个支持阻塞式和响应式服务并行的微服务云原生基座,其核心架构中广泛应用了责任链模式来构建灵活的请求处理机制。责任链模式通过将请求处理逻辑分解为一系列独立的处理器,实现了请求流程的解耦和动态配置,是构建高扩展性微服务架构的关键技术之一。 ## 责任链模式在Dante Cloud中的应用场景 责任链模式在Dante Cloud中主要应用于两大场景:**API网关请求过

gitblog_00047的博客 666

OA 审批流程是怎么实现的?详解责任链模式

责任链模式的本质,就是把“一对一”的硬编码调用,变成了“链式”的动态传递。优点解耦: 此时此刻,我(Client)并不需要知道谁(Handler)会处理请求。动态: 你可以随时调整链条的顺序,或者在中间插入一个新的拦截器(比如加一个“防 SQL 注入”的 Filter),而不需要修改业务代码。缺点性能: 链条太长的话,调用栈会很深。调试: Debug 的时候,你会发现自己在链条里跳来跳去,晕头转向。

郑龙飞 484

【Spring】Spring中用到的设计模式 - 全面解析

Spring框架巧妙运用工厂、代理、模板方法等多种设计模式,实现了高度可扩展性、灵活性和可维护性。这些模式协同工作,使Spring能够轻松应对需求变化,支持功能扩展,并保持代码结构清晰优雅。

朱朱博客,分享技术 227

java 责任链 开源代码,JavaThinker技术网站

责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。责任链模式也叫职责链模式。在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,所以责任链将请求的发送者和请求的处理者解...

weixin_28040125的博客 183

spring security的过滤器链

请求按过滤器链的顺序依次通过每个过滤器,每个过滤器可选择处理请求或传递给下一个过滤器。理解过滤器链的组成和执行逻辑,是调试安全问题和实现复杂安全需求的关键。:当某个过滤器处理完请求并直接返回响应时,后续过滤器不再执行。Spring Security 的安全功能通过一系列。捕获异常 → 触发登录页跳转或返回 403。Spring Security 的过滤器链通过。最终验证权限 → 若未授权则抛出。提取凭证并认证 → 存储。

LCY133的博客 1390

spring security 过滤器链相关初始化过程

Spring Security 的过滤器链(Filter Chain)初始化流程是其安全机制的核心实现,其设计目标是按特定顺序组装多个安全过滤器,形成一个完整的请求处理链。通过理解过滤器链的初始化流程,开发者可以更高效地定制安全策略,并快速定位安全配置相关的问题。Spring Security 过滤器链的初始化由。:检查 URL 路径匹配规则和过滤器的注册位置。,并注册到 Servlet 容器的过滤器链中。忽略静态资源路径,避免不必要的过滤器执行。:跟踪自定义过滤器的插入位置。:未将过滤器添加到正确的。

LCY133的博客 1233

设计模式:责任链模式(Spring Security)

摘要: Spring Security采用责任链模式构建双层过滤器链架构,通过FilterChainProxy(外层)匹配请求路径并触发对应的SecurityFilterChain(内层),后者包含有序的过滤器序列(如认证、授权、防护等)。

爱片闲串,爱钓鱼,爱中医,爱分享 1155
上一篇: 设计模式学习之——责任链模式
下一篇: 设计模式学习之——策略模式
Jack_abu
博客等级 码龄10年 633粉丝 78原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack_abu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值