当前位置: 首页 > news >正文

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

Spring Security 的过滤器链(Filter Chain)初始化流程是其安全机制的核心实现,其设计目标是按特定顺序组装多个安全过滤器,形成一个完整的请求处理链。以下从 源码层面配置流程 分析其初始化逻辑:


一、初始化流程概览

Spring Security 过滤器链的初始化由 FilterChainProxy 驱动,其核心流程可分为以下步骤:

  1. 触发自动配置
    Spring Boot 通过 spring-boot-starter-security 引入 SpringSecurityFilterChain 自动配置类,触发 SecurityFilterChain 的构建。

  2. 加载 WebSecurityConfiguration
    通过 @EnableWebSecurity 注解激活 WebSecurityConfiguration 配置类,初始化 WebSecurity 对象。

  3. 构建 HttpSecurity
    调用 WebSecurityConfigurerAdapter#init 方法,创建 HttpSecurity 实例,并加载所有配置的 SecurityFilterChain

  4. 组装过滤器链
    HttpSecurity 将配置的过滤器按 固定顺序 添加到链中,最终生成 SecurityFilterChain 对象。

  5. 注册 FilterChainProxy
    WebSecurity 将多个 SecurityFilterChain 封装到 FilterChainProxy,并注册到 Servlet 容器的过滤器链中。


二、源码级流程分析

1. 入口:WebSecurityConfiguration

• 通过 @Bean 创建 SpringSecurityFilterChain(即 FilterChainProxy):

@Bean(name = AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME)
public Filter springSecurityFilterChain() throws Exception {
    return webSecurity.build(); // 最终生成 FilterChainProxy
}
2. WebSecurity 的构建

WebSecurity 继承自 AbstractConfiguredSecurityBuilder,通过 build() 方法触发初始化:

public final O build() throws Exception {
    // 调用所有 WebSecurityConfigurerAdapter 的 init() 和 configure()
    for (SecurityBuilder<?> securityBuilder : securityBuilders) {
        securityBuilder.build();
    }
    // 生成 FilterChainProxy
    return performBuild();
}
3. HttpSecurity 的配置

HttpSecurity 继承自 AbstractConfiguredSecurityBuilder,通过 addFilter(Filter) 方法按顺序添加过滤器:

public HttpSecurity addFilter(Filter filter) {
    // 根据过滤器类型确定插入位置
    Integer order = this.filterOrders.getOrder(filter.getClass());
    this.filters.add(order, filter);
    return this;
}
4. 过滤器顺序管理

• 所有过滤器的顺序由 FilterOrderRegistration 类预定义,例如:

private FilterOrderRegistration() {
    addFilterToOrder(ChannelProcessingFilter.class, 0);
    addFilterToOrder(WebAsyncManagerIntegrationFilter.class, 1);
    addFilterToOrder(SecurityContextPersistenceFilter.class, 2);
    addFilterToOrder(HeaderWriterFilter.class, 3);
    // ... 其他过滤器的顺序定义
}

三、配置流程详解

1. 默认过滤器链

Spring Security 默认加载以下核心过滤器(按顺序):

过滤器名称作用顺序
ChannelProcessingFilter处理协议切换(HTTP/HTTPS)0
WebAsyncManagerIntegrationFilter集成异步请求上下文1
SecurityContextPersistenceFilter存储/恢复 SecurityContext2
HeaderWriterFilter写入安全响应头(如 CSP、HSTS)3
CsrfFilterCSRF 防护4
LogoutFilter处理注销请求5
UsernamePasswordAuthenticationFilter表单登录认证6
DefaultLoginPageGeneratingFilter生成默认登录页7
BasicAuthenticationFilterHTTP Basic 认证8
RequestCacheAwareFilter缓存请求(用于重定向后恢复)9
SecurityContextHolderAwareRequestFilter包装 ServletRequest 增强安全方法10
AnonymousAuthenticationFilter匿名用户身份填充11
SessionManagementFilter会话管理(如并发控制)12
ExceptionTranslationFilter处理安全异常(如认证/授权异常)13
FilterSecurityInterceptor最终授权决策(允许/拒绝请求)14
2. 自定义过滤器链

通过 HttpSecurity 的配置方法添加或覆盖过滤器:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .addFilterBefore(new CustomFilter(), UsernamePasswordAuthenticationFilter.class)
        .addFilterAfter(new StatsFilter(), BasicAuthenticationFilter.class)
        .csrf().disable(); // 移除 CsrfFilter
}
3. 多过滤器链配置

可定义多个 SecurityFilterChain,针对不同 URL 路径应用不同过滤器链:

@Bean
public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {
    http
        .antMatcher("/api/**")
        .authorizeRequests().anyRequest().authenticated()
        .and().addFilterBefore(new JwtFilter(), UsernamePasswordAuthenticationFilter.class);
    return http.build();
}

@Bean
public SecurityFilterChain defaultFilterChain(HttpSecurity http) throws Exception {
    http
        .authorizeRequests().anyRequest().permitAll();
    return http.build();
}

四、初始化流程调试

1. 查看已加载的过滤器

在日志中启用 DEBUG 级别,观察过滤器链的加载顺序:

logging.level.org.springframework.security=DEBUG

输出示例:

Security filter chain: [
  WebAsyncManagerIntegrationFilter
  SecurityContextPersistenceFilter
  HeaderWriterFilter
  CsrfFilter
  LogoutFilter
  UsernamePasswordAuthenticationFilter
  ...
]
2. 关键断点位置

FilterChainProxy#doFilterInternal:观察请求如何匹配过滤器链。
HttpSecurity#addFilter:跟踪自定义过滤器的插入位置。
WebSecurity#build:查看最终生成的 FilterChainProxy


五、核心设计思想

  1. 责任链模式:每个过滤器处理特定安全任务,职责单一。
  2. 可插拔性:通过 HttpSecurity 动态添加/移除过滤器。
  3. 优先级控制:通过预定义的顺序保证过滤器执行逻辑正确(例如 SecurityContextPersistenceFilter 必须在认证过滤器之前执行)。
  4. 多链支持:允许为不同的 URL 路径配置独立的安全规则。

六、常见问题

1. 过滤器顺序错误

现象:自定义过滤器未按预期顺序执行。
解决:通过 addFilterBefore()addFilterAfter() 显式指定位置。

2. 过滤器未生效

原因:未将过滤器添加到正确的 SecurityFilterChain
排查:检查 URL 路径匹配规则和过滤器的注册位置。

3. 性能问题

优化点:通过 WebSecurity#ignoring() 忽略静态资源路径,避免不必要的过滤器执行。


通过理解过滤器链的初始化流程,开发者可以更高效地定制安全策略,并快速定位安全配置相关的问题。

http://www.dtcms.com/a/112707.html

相关文章:

  • 使用 Elastic 实现端到端的大语言模型(LLM)可观测性:洞察生成式 AI 应用这个不透明的世界
  • C/C++测试框架googletest使用示例
  • 用HTML.CSS.JavaScript实现一个贪吃蛇小游戏
  • 基于Go语言实现一个网络聊天室(连接Redis版)
  • Kubernetes集群管理详解:从入门到精通
  • Eliet Chat开发日志:信令服务器注册与通信过程
  • JAVA单例模式
  • 2023-2024总结记录
  • leetcode二叉树刷题调试不方便的解决办法
  • 【Redis】服务端高并发分布式结构
  • 使用Scrapy官方开发的爬虫部署、运行、管理工具:Scrapyd
  • 网安小白筑基篇五:web后端基础之PHP
  • Springboot----@Role注解的作用
  • C++设计模式-解释器模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
  • 【Python使用】嘿马推荐系统全知识和项目开发教程第2篇:1.4 案例--基于协同过滤的电影推荐,1.5 推荐系统评估【附代码
  • 【Android】界面布局-线性布局LinearLayout-例子
  • 编程能力的跃迁时刻:技术革命与认知重构的交响曲
  • MySQL索引原理:从B+树手绘到EXPLAIN
  • 合肥京东运营服务商TOP5推荐
  • Axure数据可视化科技感大屏设计资料——赋能多领域,展示无限价值
  • C# 类库生成后自动复制到指定目录
  • Mysql 集群架构 vs 主从复制架构
  • PostgreSQL LIKE 操作符详解
  • 如何在windows 环境、且没有显卡的情况下用python跑通从ModelScope下载的大模型的调用
  • FPGA状态机思想实现流水灯及HDLBits学习
  • 02.unity各个面板说明
  • JSON Crack:简化数据可视化的参数编辑器
  • 【Guava】新集合 - BiMapMultimapMultiset
  • JavaScript中左键单击(click)与双击(dblclick)事件的关系解析地图操作避坑
  • vue项目data functions should return an object