Skip to content

Spring Security 6 总览

Spring Security 在 Spring Boot 3 里默认走 Servlet 安全链路,核心是把认证、授权、上下文保存、异常处理、登录态恢复拆成一组可组合的过滤器和策略对象。

体系结构

  • SecurityContextHolder:线程内安全上下文入口。
  • Authentication:当前主体的抽象。
  • UserDetailsService:账号读取入口。
  • AuthenticationManager:认证调度器。
  • AuthorizationManager:授权决策器。
  • SecurityFilterChain:一条安全过滤器链。
  • FilterChainProxy:安全链总入口。
java
@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http
                .authorizeHttpRequests(auth -> auth
                        .requestMatchers("/auth/**").permitAll()
                        .anyRequest().authenticated())
                .formLogin(Customizer.withDefaults())
                .build();
    }
}

请求如何经过安全体系

  1. 请求进入 Servlet Filter。
  2. DelegatingFilterProxy 把请求转给 Spring 容器中的 springSecurityFilterChain
  3. FilterChainProxy 选择命中的 SecurityFilterChain
  4. 链上过滤器依次执行认证、授权、异常翻译。
  5. 请求结束后清理 SecurityContextHolder

核心问题切分

  • 认证:请求主体是谁。
  • 授权:主体是否能访问目标资源。
  • Session:服务端如何保存登录态。
  • JWT:客户端如何携带身份声明。
  • OAuth2:如何接入第三方身份系统。

企业项目目录建议

text
src/main/java/com/example/demo
  ├── auth
  ├── config
  ├── controller
  ├── domain
  ├── repository
  ├── security
  └── service
java
@RestController
@RequestMapping("/api")
class MeController {

    @GetMapping("/me")
    Map<String, Object> me(Authentication authentication) {
        return Map.of(
                "name", authentication.getName(),
                "authorities", authentication.getAuthorities());
    }
}