spring security的过滤器链

news2025/3/31 14:26:53

Spring Security 的安全功能通过一系列过滤器(Filter)组成的链式结构实现,每个过滤器负责处理特定的安全任务。这些过滤器按特定顺序执行,形成过滤器链(Security Filter Chain)。以下是其核心过滤器及工作原理的详细解析:


一、默认过滤器链(按执行顺序)

过滤器名称(类名)作用
1. SecurityContextPersistenceFilter从 Session 加载或创建 SecurityContext(存储认证信息)。
2. HeaderWriterFilter写入安全相关的 HTTP 头(如 X-Content-Type-OptionsX-Frame-Options)。
3. CsrfFilter检查 CSRF Token(防止跨站请求伪造)。默认保护非 GETHEADTRACEOPTIONS 请求。
4. LogoutFilter处理注销请求(默认路径 /logout),清除安全上下文和 Session。
5. UsernamePasswordAuthenticationFilter处理表单登录(默认路径 /login),提取用户名密码并认证。
6. DefaultLoginPageGeneratingFilter生成默认登录页(当未配置自定义登录页时生效)。
7. DefaultLogoutPageGeneratingFilter生成默认注销页。
8. BasicAuthenticationFilter处理 HTTP Basic 认证(Authorization: Basic <token>)。
9. RequestCacheAwareFilter缓存请求,用于登录成功后恢复原始请求(如访问 /admin 被拦截后跳转登录页)。
10. SecurityContextHolderAwareRequestFilter包装请求对象(HttpServletRequest),提供安全相关方法(如 isUserInRole)。
11. AnonymousAuthenticationFilter为未认证用户分配匿名身份(默认角色 ROLE_ANONYMOUS)。
12. SessionManagementFilter管理会话(如并发控制、会话固定攻击防护)。
13. ExceptionTranslationFilter处理认证/授权异常,触发 AuthenticationEntryPoint(如跳转登录页)或返回 403。
14. FilterSecurityInterceptor最终授权决策,调用 AccessDecisionManager 验证用户是否有权访问资源。

二、过滤器链工作原理

1. 责任链模式(Chain of Responsibility)

执行顺序:请求按过滤器链的顺序依次通过每个过滤器,每个过滤器可选择处理请求或传递给下一个过滤器。
终止条件:当某个过滤器处理完请求并直接返回响应时,后续过滤器不再执行。

2. 核心流程
HTTP 请求 → 过滤器1 → 过滤器2 → ... → 过滤器N → 访问资源
          ↓          ↓               ↓
          处理逻辑    处理逻辑         处理逻辑

认证流程
UsernamePasswordAuthenticationFilter 提取凭证并认证 → 存储 AuthenticationSecurityContextHolder
授权流程
FilterSecurityInterceptor 最终验证权限 → 若未授权则抛出 AccessDeniedException
异常处理
ExceptionTranslationFilter 捕获异常 → 触发登录页跳转或返回 403。

3. 关键交互示例
用户访问受保护资源(如 `/admin`):
1. SecurityContextPersistenceFilter 加载 SecurityContext(若已登录则存在 Authentication)。
2. AnonymousAuthenticationFilter 为未认证用户赋予匿名身份。
3. FilterSecurityInterceptor 检查权限 → 发现未认证 → 抛出 AccessDeniedException。
4. ExceptionTranslationFilter 捕获异常 → 调用 AuthenticationEntryPoint 跳转登录页。
5. 用户提交登录表单 → UsernamePasswordAuthenticationFilter 认证成功 → 更新 SecurityContext。
6. 用户再次访问 `/admin` → FilterSecurityInterceptor 验证权限 → 允许访问。

三、如何查看和配置过滤器链

1. 查看默认过滤器链

在日志中设置 DEBUG 级别:

logging.level.org.springframework.security.web.FilterChainProxy=DEBUG

启动应用后,日志会输出默认过滤器链顺序:

Security filter chain: [
  WebAsyncManagerIntegrationFilter
  SecurityContextPersistenceFilter
  HeaderWriterFilter
  CsrfFilter
  LogoutFilter
  ...
]
2. 自定义过滤器链

通过 HttpSecurity 配置添加、移除或调整过滤器:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
        // 禁用默认表单登录过滤器
        .formLogin(AbstractHttpConfigurer::disable)
        // 添加自定义过滤器(如 JWT 过滤器)
        .addFilterBefore(jwtAuthFilter(), UsernamePasswordAuthenticationFilter.class)
        // 配置权限规则
        .authorizeHttpRequests(auth -> auth
            .requestMatchers("/admin/**").hasRole("ADMIN")
            .anyRequest().permitAll()
        );
    return http.build();
}

四、常见过滤器的扩展场景

1. 添加自定义过滤器
public class CustomAuthFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {
        // 自定义认证逻辑(如验证请求头中的 Token)
        chain.doFilter(request, response);
    }
}

// 注册到过滤器链
http.addFilterBefore(new CustomAuthFilter(), BasicAuthenticationFilter.class);
2. 禁用默认过滤器
http.csrf(csrf -> csrf.disable()); // 禁用 CSRF 防护
3. 调整过滤器顺序
// 将自定义过滤器插入到 CsrfFilter 之后
http.addFilterAfter(new CustomFilter(), CsrfFilter.class);

五、总结

Spring Security 的过滤器链通过责任链模式实现灵活的安全控制,核心特点包括:

  1. 模块化:每个过滤器专注单一职责(如认证、授权、CSRF 防护)。
  2. 可扩展:支持自定义过滤器插入任意位置。
  3. 顺序敏感:过滤器执行顺序影响安全行为(如 CsrfFilter 必须在认证过滤器之前执行)。

理解过滤器链的组成和执行逻辑,是调试安全问题和实现复杂安全需求的关键。

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

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

相关文章

人工智能:officeAI软件,如何调整AI对话界面的字体?

1、首先&#xff0c;随便打开一个excel&#xff08;使用wps&#xff09; 依次点击上方的【OfficeAI】—【右侧面板】 2、在弹出的面板中&#xff0c;输入&#xff1a;助手设置 &#xff0c; 然后按【回车】发送出去 3、之后会弹出界面&#xff0c;在【样式设定】中&#xff…

Qt之共享内存类QSharedMemory的使用及实现原理(全)

目录 1.简介 2.使用 3.实现原理 3.1.Windows内存映射 3.2.POSIX 共享内存 3.3.System V 共享内存 3.4.QSharedMemory的实现原理 4.总结 1.简介 QSharedMemory 是 Qt 框架提供的一个类&#xff0c;用于在不同进程或线程之间实现共享内存的管理。借助共享内存&#xff0c…

Problem A: 接口使用

1.题目问题 2.样例 3.代码实现 补充&#xff1a;注意空格 // 定义Vehicle接口 interface Vehicle {void start();void stop(); }// 实现Vehicle接口的Bike类 class Bike implements Vehicle {Overridepublic void start() {System.out.println("i am bike,i am running&…

用Python插入Excel表格到Word文档

在日常办公场景中&#xff0c;通过Python脚本自动化整合Excel数据与Word文档&#xff0c;能够实现表格的智能迁移&#xff0c;满足不同场景下数据呈现的专业性要求。直接提取表格内容插入Word适用于需要快速传递核心数据的场景&#xff0c;确保信息精准直达&#xff1b;完整复制…

合合信息TextIn大模型加速器 2.0来了:智能文档解析和图表解析能力全面升级

合合信息“TextIn大模型加速器 2.0”版本来了&#xff1a;文档解析和图表解析能力全面升级 背景 在日常工作中&#xff0c;我们常常遇到无法直接复制的文档内容或图片内容&#xff0c;这些内容通常需要进行识别和解析。一个典型的例子是&#xff0c;当我们需要将折线图转化为…

消息队列Message Queue

前面&#xff0c;我们在黑点点评中秒杀场景中&#xff0c;首次了解到消息队列MQ&#xff0c;它主要解决了秒杀场景中异步场景&#xff0c;提升了并发性&#xff0c;吞吐量。可是还是对消息队列又很多的疑惑&#xff1f; 消息队列是什么 消息队列是一种通信协议或中间件&#…

如何利用AI智能生成PPT提升工作效率

如何利用AI智能生成PPT提升工作效率&#xff1f;PPT制作曾经是每个人办公生活中的一大痛点。你有多久没有在制作PPT时感到焦头烂额&#xff0c;选模板、调整格式、插入图片&#xff0c;每一项都得花费大量的时间和精力&#xff0c;最后还未必能做出一份令人满意的效果。随着人工…

WIN11 企业版 部署Dify+Docker

Dify&#xff08;Do it for you&#xff09;是一款开源的大语言模型应用开发平台&#xff0c;旨在简化AI应用的创建、部署和管理过程&#xff0c;使开发者能够更快速、更轻松地构建和运营基于GPT等模型的AI应用。 Dify平台创建和运营一个AI chatbot应用&#xff0c;涉及到登录…

1.25-20GHz/500ns超快跳频!盛铂SWFA300国产捷变频频率综合器模块赋能雷达/5G/电子战高频精密控制 本振/频综模块

盛铂SWFA300捷变频频率综合器模块简述&#xff1a; 盛铂科技国产SWFA300捷变频频率综合器是一款在频率范围内任意两点频率的跳频时间在500nS以内的高速跳频源&#xff0c;其输出频率范围为1.25GHz至20GHz&#xff0c;频率的最小步进为10kHz。同时它拥有优秀的相位噪声特性&…

代理IP协议详解HTTP、HTTPS、SOCKS5分别适用于哪些场景

“代理IP协议在现代网络通信中扮演着至关重要的角色。它们通过提供中间层服务&#xff0c;帮助用户匿名访问网络、绕过地理限制、提高安全性和加速数据传输。HTTP、HTTPS和SOCKS5是三种最常见的代理IP协议&#xff0c;每种协议都有其特定的用途和适用场景。” HTTP代理及其适用…

AIGC工具平台-通用抠图换背景

本模块采用先进的大模型智能算法&#xff0c;精准识别并分割图像中的人物或物品主体&#xff0c;实现高效、精准、智能化的抠图处理。无论是人物肖像、产品展示&#xff0c;还是复杂场景&#xff0c;该工具均能准确提取主体&#xff0c;并自动适配至背景图像&#xff0c;实现自…

word快速创建虚拟文字

创建虚拟文字的作用&#xff1a;如培训新员工使用 Word&#xff0c;用虚拟文字演示如何设置段落格式。不需要你随便乱敲文字或者去复制一段文字过来。帮你节约了时间&#xff01; 两个函数的使用必须在段落的开头&#xff01;&#xff01;&#xff01; rand函数 在 Word 中…

win10下python脚本运行缺失ccache的问题处理

问题 python脚本运行时&#xff0c;会提醒参考 https://github.com/ccache/ccache/blob/master/doc/INSTALL.md 处理缺失ccache的问题。 下载编译 下载ccache主干版本&#xff0c; 例如 https://github.com/ccache/ccache/archive/refs/heads/master.zip 按照说明编译 mkd…

开发复合组件TLabel + TwwDBLookupCombo

老鸟跳过。。。。。。。。本文只是为小白准备的 -------------- TwwDBLookupCombo 组件是老牌控件包的 Inofpower 中的一个组件。Inofpower 很久也没有更新了&#xff0c;只是作了新版DELPHI的适配&#xff0c;组件的功能从D2007那些开始到现在&#xff0c;可以说几乎没有任何…

0328-内存图2

是否正确待定&#xff1a; Perso类 package com.qc.内存图2;public class Perso {public int age;public String name;public static int flag;public void m1() {}public static void m2() {}Overridepublic String toString() {return "Perso [age" age "…

【ESP32S3】esp32获取串口数据并通过http上传到前端

通过前面的学习&#xff08;前面没发过&#xff0c;因为其实就是跑它的demo&#xff09;了解到串口配置以及开启线程实现功能的工作流程&#xff0c;与此同时还有esp32作为STA节点&#xff0c;将数据通过http发送到服务器。 将这两者联合 其实是可以得到一个&#xff1a;esp32获…

《一本书讲透Elasticsearch:原理、进阶与工程实践》读书笔记

1&#xff1a;es的组成部分&#xff1a; Elasticsearch 引擎&#xff1a;核心组件&#xff0c;处理索引和搜索请求 Kibana&#xff1a;es的可视化的数据界面&#xff0c;用于分析和展示数据 Beats&#xff08;可选&#xff09;轻量级的日志采集器 2&#xff1a;基本概念 es开…

Android15查看函数调用关系

Android15 Camera3中打印函数调用栈 1.使用CallStack跟踪函数调用 修改涉及三个内容&#xff1a; Android.bp中添加对CallStack的引用。CallStack被打包在libutilscallstack.so。代码中包含CallStack的头文件。代码中调用CallStack接口&#xff0c;打印函数调用栈。 例子&am…

macOS 15 通过 MacPorts 安装 PHP 7 构建错误找不到符号在 dns.o 中解决方法

构建遇到的问题如下&#xff1a; "_res_9_dn_expand", referenced from:_php_parserr in dns.o_php_parserr in dns.o_php_parserr in dns.o_php_parserr in dns.o_php_parserr in dns.o_php_parserr in dns.o_zif_dns_get_mx in dns.o..."_res_9_dn_skipname&…

练习:猜数字小游戏

需求&#xff1a; 程序自动生成一个 1 - 100 之间的随机数字&#xff0c;使用程序实现猜出这个数字是多少&#xff1f; 代码&#xff1a; //猜数字小游戏 package demo01; import java.util.Random; import java.util.Scanner; public class HelloJava {public static void …