下面给你一份 工程师视角的 Spring Security 原理说明。不讲教程、不讲注解,只讲它是怎么工作的,你看完就能自己画出它的处理链。
一句话总览
Spring Security 是一个“可插拔的 HTTP 安全过滤器链 + 认证与授权引擎”。
它本质上不是框架,而是:
运行在 Servlet Filter / WebFilter 层的安全中间件。
一、核心架构:一条“安全流水线”
所有 Spring Security 请求都走:
Browser / Client
↓
Servlet Container (Tomcat)
↓
FilterChainProxy ← Spring Security
↓
DispatcherServlet
↓
Controller
Spring Security 干的事情只有一件:
在 Controller 之前决定:你是谁?你能干什么?
二、FilterChainProxy:真正的入口
Spring Security 注册了一个 Filter:
DelegatingFilterProxy
→ FilterChainProxy
→ SecurityFilterChain[]
每个请求:
- 匹配一个 SecurityFilterChain
- 这个 chain 里是一堆 Filter:
- CSRF
- CORS
- Authentication
- Authorization
- Session
- etc
你配置的 http.authorizeHttpRequests() 本质上是在构建这条链。
三、认证(Authentication)是如何发生的
认证的核心接口:
AuthenticationManager
└── ProviderManager
└── AuthenticationProvider[]
流程:
HTTP 请求
↓
UsernamePasswordAuthenticationFilter
↓
AuthenticationManager.authenticate()
↓
AuthenticationProvider.supports()
↓
UserDetailsService.loadUserByUsername()
↓
PasswordEncoder.matches()
↓
生成 Authentication 对象
最终结果是一个:
Authentication {
principal = UserDetails
authorities = ROLE_ADMIN, ...
authenticated = true
}
四、SecurityContext:你的“登录状态”
认证成功后:
Authentication → SecurityContext → SecurityContextHolder
Spring Security 在后续请求中:
- 从 Session / JWT / Header 取出 Authentication
- 放回 SecurityContextHolder(ThreadLocal)
Controller 中的:
SecurityContextHolder.getContext().getAuthentication()
就是从这里来的。
五、授权是如何做的
授权不看 Session,只看:
SecurityContext 里的 Authentication
当你写:
@PreAuthorize("hasRole('ADMIN')")
底层发生:
MethodSecurityInterceptor
→ AccessDecisionManager
→ Voter.hasRole()
或者 HTTP 层:
.authorizeHttpRequests()
.requestMatchers("/admin/**").hasRole("ADMIN")
底层是:
FilterSecurityInterceptor
→ AuthorizationManager
→ Authentication.authorities
六、JWT / OAuth2 为什么能接进来
因为 Spring Security 根本不关心你怎么登录。
它只关心:
你能不能在请求中构造出一个 Authentication 对象
所以:
| 方式 | 干了什么 |
| Session | 从 Session 还原 Authentication |
| JWT | 解析 Token → 构造 Authentication |
| OAuth2 | 拿到用户信息 → 构造 Authentication |
| SSO | 同上 |
你只要写一个 Filter:
JWT → Authentication → SecurityContext
Spring Security 其他全部自动生效。
七、为什么 Spring Security 看起来“复杂”
因为它是企业级安全内核:
- HTTP 层
- Method 层
- Session 层
- Token 层
- 多租户
- 多认证源
- RBAC / ABAC
但它的核心逻辑其实极其简单:
Request
→ Authentication
→ Authorization
→ Allow / Deny
八、终极工程结论
Spring Security 是一个“把 HTTP 请求转化为用户身份,再用规则引擎判断权限”的流水线。
你要真正掌握它,只需要抓住三件事:
- Authentication 是什么?从哪来?
- SecurityContext 怎么保存和恢复?
- Authorization 在哪里做判断?
如果你愿意,我可以:
- 给你一套 JWT + Spring Security 的最小实现架构图
- 或对比 Spring Security vs Shiro vs 自研鉴权
- 或直接拆解 你现在用的某个 Spring Security 配置