Appearance
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();
}
}请求如何经过安全体系
- 请求进入 Servlet Filter。
DelegatingFilterProxy把请求转给 Spring 容器中的springSecurityFilterChain。FilterChainProxy选择命中的SecurityFilterChain。- 链上过滤器依次执行认证、授权、异常翻译。
- 请求结束后清理
SecurityContextHolder。
核心问题切分
- 认证:请求主体是谁。
- 授权:主体是否能访问目标资源。
- Session:服务端如何保存登录态。
- JWT:客户端如何携带身份声明。
- OAuth2:如何接入第三方身份系统。
企业项目目录建议
text
src/main/java/com/example/demo
├── auth
├── config
├── controller
├── domain
├── repository
├── security
└── servicejava
@RestController
@RequestMapping("/api")
class MeController {
@GetMapping("/me")
Map<String, Object> me(Authentication authentication) {
return Map.of(
"name", authentication.getName(),
"authorities", authentication.getAuthorities());
}
}