请给我介绍spring security的原理

下面给你一份 工程师视角的 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[]

每个请求:


  1. 匹配一个 SecurityFilterChain
  2. 这个 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 请求转化为用户身份,再用规则引擎判断权限”的流水线。


你要真正掌握它,只需要抓住三件事:


  1. Authentication 是什么?从哪来?
  2. SecurityContext 怎么保存和恢复?
  3. Authorization 在哪里做判断?



如果你愿意,我可以:


  • 给你一套 JWT + Spring Security 的最小实现架构图
  • 或对比 Spring Security vs Shiro vs 自研鉴权
  • 或直接拆解 你现在用的某个 Spring Security 配置