[Java后端]Spring Security 揭秘:你的请求是如何被“安检”的?
Spring Security 揭秘:你的请求是如何被“安检”的?
你好,未来的技术大神们!
你是否曾经好奇,在一个 Spring Boot 项目中,当我们加入 Spring Security 依赖后,那些神秘的登录页、权限控制是如何实现的?为什么有些 URL 随便访问,有些却提示“401 未授权”?
今天,我们就用一个生动有趣的比喻,来彻底揭开 Spring Security 的神秘面纱,让你看懂每个网络请求在你的应用中经历了一场怎样的“安全检查”。
舞台搭建:我们的“应用大厦”
首先,把你的 Spring Boot 应用想象成一座高科技的现代化大厦。大厦里有你的 Controller(各个办公室)、Service(核心业务部门)和 Repository(档案室)。
当一个 HTTP 请求(比如用户想访问 /api/user/profile)发来时,就如同一个访客想要进入大厦,并前往某个办公室。
在没有安保系统(Spring Security)的情况下,任何访客都可以随意进出,直达任何办公室。这显然非常危险!
第一位关键人物:DelegatingFilterProxy (大厦门口的接待员)
当我们给项目加上 Spring Security 依赖并使用 @EnableWebSecurity 注解时,最重要的事情发生了:我们相当于在大厦唯一的入口处,安排了一位名叫 DelegatingFilterProxy 的接待员。
这位接待员是由 Servlet 容器(比如 Tomcat)直接管理的,非常尽职尽责。他的工作只有一个:拦截所有试图进入大厦的访客(所有 HTTP 请求),然后把他们引导到大厦内部真正的安保中心去。
他自己不负责做任何检查,他只做“引导”。他就像一个连接外部街道(Servlet 世界)和内部安保系统(Spring 世界)的桥梁。
第二位关键人物:FilterChainProxy (安保中心总调度)
接待员将访客引导到哪里去呢?他会通过访客胸牌上的一个特殊名字 springSecurityFilterChain,找到大厦内部一个同样叫做 springSecurityFilterChain 的部门——这就是我们的安保中心总调度 FilterChainProxy。
FilterChainProxy 是 Spring Security 的核心,它是一个非常聪明的调度系统。它管理着一套或多套详细的“安检流水线”。
核心设计图:SecurityFilterChain (安检流水线蓝图)
FilterChainProxy(安保中心)是如何知道该如何检查访客的呢?答案来自你亲手绘制的“安检流水线蓝图”——也就是你在 SecurityConfig 类中定义的 SecurityFilterChain Bean。
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
// ... 在这里定义各种规则 ...
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll() // 公共区域,免检
.requestMatchers("/admin/**").hasRole("ADMIN") // VIP通道,查身份
.anyRequest().authenticated() // 其他区域,需登录
);
return http.build();
}
}
@EnableWebSecurity: 这个注解就像是在告诉 Spring:“嘿,我要启用安保系统了,快来我这里找蓝图!”SecurityFilterChain filterChain(...): 这个@Bean方法就是你绘制蓝图的地方。HttpSecurity http: Spring 提供给你的“图纸”,你可以在上面尽情设计。比如:.requestMatchers("/public/**").permitAll(): 你在图纸上画了一个区域,标记为“公共大厅”,任何人都可以进。.requestMatchers("/admin/**").hasRole("ADMIN"): 你又画了一个区域,标记为“总裁办公室”,并规定只有胸牌上印着“ADMIN”的 VIP 才能进。.anyRequest().authenticated(): 对于所有其他未标记的区域,你规定只要是“已登记的访客”(已认证)就能进。.addFilterBefore(...): 你还可以在流水线上增加特殊的检查站,比如我们常用的JwtAuthenticationFilter,专门用来检查访客的 JWT 电子门禁卡。
应用启动时,Spring Security 的总设计师 (WebSecurityConfiguration) 就会找到你画的这张蓝图,并据此建造出一条真实的安检流水线,交给 FilterChainProxy(安保中心)来管理。
一次完整的“安检”流程
现在,我们把所有环节串起来,看看一个请求(访客)的完整旅程:
-
访客到达: 一个
GET /api/admin/dashboard请求(一位想去总裁办公室的访客)到达大厦门口。 -
接待员引导:
DelegatingFilterProxy(接待员) 拦下他,看了一眼他的目标,然后通过内部对讲机呼叫springSecurityFilterChain(安保中心)。 -
安保中心接手:
FilterChainProxy(安保中心) 接待了这位访客,并把他推上了你设计的那条“安检流水线”。 -
流水线检查:
- 第一站:JWT 检查 (
JwtAuthenticationFilter):检查访客是否佩戴了有效的电子门禁卡(JWT Token)。如果有效,就读取卡片信息(用户ID、角色),并临时记录在案。 - 第二站:权限核对 (
AuthorizationFilter):流水线系统看到访客的目标是/api/admin/dashboard,查询蓝图发现这里需要ADMIN角色。于是,它检查刚刚 JWT 检查站记录的信息,发现访客的角色正是ADMIN。 - 检查通过!
- 第一站:JWT 检查 (
-
放行: 访客顺利通过所有安检,被放行,最终到达了
AdminController的getDashboard()方法(总裁办公室)。
如果访客没有门禁卡,或者卡片上的角色不对,他就会在安检的某个环节被拦下,并被保安(ExceptionTranslationFilter)请出去,同时收到一张“401 未授权”或“403 禁止访问”的通知单。
总结
希望这个“大厦安检”的比喻能帮助你理解 Spring Security 的工作原理。记住这几个关键角色:
@EnableWebSecurity: 安保系统启动开关。DelegatingFilterProxy: 门口的接待员,连接外部和内部。SecurityFilterChainBean: 你亲手绘制的安检流水线蓝图。FilterChainProxy(springSecurityFilterChain): 管理和执行流水线的安保中心。
现在,你不仅知道了 Spring Security “是什么”,更理解了它“为什么”以及“如何”这样工作。下次再看到 SecurityConfig,你看到的将不再是复杂的代码,而是一套清晰、有序的安检规则!

浙公网安备 33010602011771号