spring security中httpSecurity构建DefaultSecurityFilterChain逻辑
概述
HttpSecurity 是 Spring Security 中用于配置 Web 层安全的核心类,可以把它理解为整个安全过滤器链的“总设计师”和“建造指挥”。我们日常编写的 http.authorizeRequests(), http.formLogin(), http.csrf() 等配置,本质上都是在与这个“总设计师”交互,指挥它如何组装和配置最终的安全防线——DefaultSecurityFilterChain。
一、 核心角色与架构定位
首先,我们来看 HttpSecurity 在整个架构中的位置和角色。
- 建造者模式 (Builder Pattern) 的体现
HttpSecurity继承自AbstractConfiguredSecurityBuilder<DefaultSecurityFilterChain, HttpSecurity>,并实现了SecurityBuilder<DefaultSecurityFilterChain>接口。这明确了它的核心职责:构建DefaultSecurityFilterChain对象。- 它采用了链式调用的 DSL (领域特定语言) 风格,如
http.authorizeRequests().and().formLogin(),使得配置非常直观和流畅。
- 配置的聚合中心
HttpSecurity内部维护了一个configurers集合,用于存放所有的SecurityConfigurer(如CsrfConfigurer, FormLoginConfigurer, AuthorizeRequestsConfigurer等)。- 当我们调用
http.csrf()、http.formLogin()等方法时,Spring Security 实际上是在获取或创建对应的SecurityConfigurer,并将其添加到这个集合中,为后续的构建做准备。
- 共享资源的容器
HttpSecurity内部有一个sharedObjects (Map),用于在不同的SecurityConfigurer之间共享关键组件,最典型的就是 `AuthenticationManager``。这避免了重复创建和配置不一致的问题。
二、 DefaultSecurityFilterChain 是什么?
- 定义: 它是
SecurityFilterChain接口的唯一标准实现类,代表了一条完整的、有序的安全过滤器链。 - 核心属性:
RequestMatcher requestMatcher: 一个请求匹配器,用于判断哪些 HTTP 请求应该被这条过滤器链处理。例如,new AntPathRequestMatcher("/**")表示拦截所有请求。一个FilterChainProxy可以包含多个DefaultSecurityFilterChain,请求进来时会根据matcher找到对应的链。List<Filter> filters: 这条链上包含的所有javax.servlet.Filter对象,并且顺序至关重要。
- 核心方法:
boolean matches(HttpServletRequest request),使用requestMatcher来判断给定的请求是否属于此链。
三、 HttpSecurity 构建 DefaultSecurityFilterChain 的完整流程
这是整个逻辑的核心。当我们定义一个 SecurityFilterChain Bean 并调用 http.build() 时,背后会触发一套精密的构建流程。这个流程由其父类 AbstractConfiguredSecurityBuilder 的 doBuild() 方法主导。
流程图解:
用户配置 (SecurityFilterChain Bean)
|
v
[1. 初始化阶段] (HttpSecurity 构造)
- 创建共享对象 Map (sharedObjects)
- 初始化默认的 Configurers (csrf, exceptionHandling, headers等)
|
v
[2. 配置阶段]
- 调用 http.authorizeRequests() -> 获取/创建 AuthorizeRequestsConfigurer
- 调用 http.formLogin() -> 获取/创建 FormLoginConfigurer
- 调用 http.csrf().disable() -> 获取 CsrfConfigurer 并禁用
- ... 所有 Configurer 被 add 到 http.configurers 集合中
|
v
[3. 构建阶段] (调用 http.build())
- 3.1 beforeInit() -> (空的钩子方法)
- 3.2 init() -> **遍历所有 Configurer,调用其 init() 方法**
- Configurer 从 sharedObjects 中获取所需资源 (如 AuthenticationManager)
- Configurer 创建自身的 Filter (如 FormLoginConfigurer 创建 UsernamePasswordAuthenticationFilter)
- Configurer 将创建的 Filter 添加到 HttpSecurity 的 filters 列表中
- 3.3 beforeConfigure() -> (空的钩子方法)
- 3.4 configure() -> **遍历所有 Configurer,调用其 configure(B) 方法**
- 这是配置的核心,Configurer 对自身和添加的 Filter 进行精细化配置
- 例如,FormLoginConfigurer 会设置登录页面URL、成功/失败处理器等
- 3.5 performBuild() -> **执行最终的组装**
- 3.5.1 **过滤器排序**: 对 `filters` 列表中的所有 Filter 进行排序。Spring Security 为内置过滤器定义了 `FilterOrder` 注解或 `Ordered` 接口来确定其固定顺序(如 `SecurityContextPersistenceFilter` 在最前,`FilterSecurityInterceptor` 在最后)。
- 3.5.2 **创建 DefaultSecurityFilterChain**: `new DefaultSecurityFilterChain(requestMatcher, sortedFilters)`。这里的 `requestMatcher` 来自于 `http.requestMatchers()` 的配置,默认为 /\*\*`。
- 3.5.3 **返回结果**: 返回创建好的 `DefaultSecurityFilterChain` 实例。
|
v
[4. 运行时阶段] (FilterChainProxy)
- Spring 的 `DelegatingFilterProxy` 将请求交给名为 `springSecurityFilterChain` 的 Bean。
- 这个 Bean 就是 `FilterChainProxy`。
- `FilterChainProxy` 内部维护了所有 `SecurityFilterChain` 的列表。
- 请求到来时,`FilterChainProxy` 遍历列表,调用 `chain.matches(request)` 找到第一个匹配的 `DefaultSecurityFilterChain`。
- 然后,依次执行该链中的 `filters` 列表里的所有过滤器。
四、 核心组件深度解析
SecurityConfigurer:安全功能的模块化单元
SecurityConfigurer 是 Spring Security 实现高内聚、低耦合的关键。每个安全功能(如 CSRF、表单登录、会话管理)都被封装在一个 SecurityConfigurer 中。
- 生命周期方法:
init(B builder): 初始化阶段调用。用于从builder的sharedObjects中获取依赖,并创建对应的 Filter 实例。例如,CsrfConfigurer在init中会创建CsrfFilter。configure(B builder): 配置阶段调用。用于对创建的 Filter 进行详细配置,并将其添加到builder的过滤器列表中。
- 例子:
CsrfConfigurer-> 配置和创建CsrfFilterFormLoginConfigurer-> 配置和创建UsernamePasswordAuthenticationFilterAuthorizeRequestsConfigurer-> 配置和创建FilterSecurityInterceptor
SharedObjects:配置器间的通信桥梁
HttpSecurity 构造时会创建一个 sharedObjects Map。这使得不同 Configurer 之间可以共享同一个实例,而无需重新创建。
- 典型共享对象:
AuthenticationManager: 最重要的共享对象。AuthenticationManagerBuilder在初始化时会创建一个ProviderManager并放入sharedObjects。之后,FormLoginConfigurer、BasicAuthenticationConfigurer等都可以从中获取同一个AuthenticationManager实例。UserDetailsService: 用户详情服务。AuthenticationEventPublisher: 认证事件发布器。ObjectPostProcessor: 用于对 Bean 进行后置处理,是 Spring Security 内部的强大扩展点。
- 过滤器顺序 (FilterOrder)
过滤器的执行顺序是固定的,由 FilterOrder 接口或 @Order 注解定义。这保证了安全逻辑的正确性(例如,必须先有安全上下文,才能进行授权)。
WebAsyncManagerIntegrationFilter: 集成 Web 异步管理。SecurityContextPersistenceFilter: 核心,加载和保存SecurityContext。HeaderWriterFilter: 写入安全相关的 HTTP 头。CorsFilter: 处理跨域请求。CsrfFilter: 处理 CSRF 攻击防护。LogoutFilter: 处理用户登出。UsernamePasswordAuthenticationFilter: 处理表单登录认证。BasicAuthenticationFilter: 处理 HTTP Basic 认证。RequestCacheAwareFilter: 缓存请求(如登录前的请求)。SecurityContextHolderAwareRequestFilter: 包装请求对象。AnonymousAuthenticationFilter: 处理匿名用户认证。SessionManagementFilter: 会话管理。ExceptionTranslationFilter: 异常转换(如处理AccessDeniedException)。FilterSecurityInterceptor: 核心,执行最终的授权决策。
五、 总结与类比
HttpSecurity: 是一个建筑总包公司。它不直接砌砖,但它拥有所有施工队(SecurityConfigurer)的名单和联系方式,并持有所有建筑材料(SharedObjects)的仓库钥匙。SecurityConfigurer: 是各个专业施工队(如水电队、泥工队、油漆队)。每个施工队知道如何建造自己的部分(创建Filter),并知道需要什么材料(从sharedObjects获取),以及如何与其他施工队协作(通过FilterOrder确定施工顺序)。SecurityFilterChain: 是最终交付的完整建筑(一套安全的房间)。它有明确的入口规则(RequestMatcher),并且内部的所有设施(Filter)都按照严格的顺序安装好了。FilterChainProxy: 是物业管理中心。它管理着所有建筑(多个SecurityFilterChain),当有人(HTTP 请求)来访时,它会根据访客的目的地(URL)将其引导到正确的建筑,并让他按顺序通过所有安检门(Filter)。build()方法: 是开工指令。一旦总包公司(HttpSecurity)接到开工指令,它就会依次通知所有施工队(Configurer)进场,先初始化(init),再施工(configure),最后由总包公司自己进行最终的质检和交付(performBuild),生成最终的建筑(DefaultSecurityFilterChain)。
通过这种设计,Spring Security 实现了极高的灵活性和可扩展性。开发者只需通过 HttpSecurity 这个统一的入口,以声明式的方式“点单”所需的安全功能,而无需关心底层复杂的过滤器创建、排序和组装过程。同时,通过 SecurityConfigurer 和 SharedObjects 机制,也保证了内部组件的高度内聚和低耦合。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)