Spring Security 是 Spring 生态中安全管理的核心框架,提供全面的安全能力,涵盖认证、授权、攻击防护等。以下是其核心功能及典型应用场景:
1. 认证(Authentication)
作用:验证用户身份(如账号密码、OAuth2 第三方登录等)。
核心组件:
• UserDetailsService
:加载用户信息(如从数据库读取用户)。
• AuthenticationProvider
:定义认证逻辑(如密码加密验证)。
• SecurityContextHolder
:存储当前用户的安全上下文。
示例配置:
@Bean
public UserDetailsService userDetailsService() {
return username ->
User.builder()
.username("user")
.password(passwordEncoder().encode("123456"))
.roles("USER")
.build();
}
2. 授权(Authorization)
作用:控制用户对资源的访问权限(如 URL、方法、数据)。
关键注解:
• @PreAuthorize
:方法执行前检查权限(需启用 @EnableMethodSecurity
)。
• @PostAuthorize
:方法执行后检查返回值权限。
示例:
@GetMapping("/admin")
@PreAuthorize("hasRole('ADMIN')") // 仅允许 ADMIN 角色访问
public String adminPage() {
return "Admin Area";
}
3. 安全防护(Protection)
作用:防御常见网络攻击。
核心防护机制:
• CSRF 防护:默认启用,防止跨站请求伪造(对 REST API 可禁用)。
• CORS 配置:管理跨域请求(通过 CorsConfigurationSource
)。
• HTTP 安全头:自动添加 X-Content-Type-Options
、X-Frame-Options
等防护头。
禁用 CSRF(仅限无状态 API):
http.csrf(csrf -> csrf.disable());
4. 会话管理(Session Management)
作用:控制用户会话行为。
关键能力:
• 会话固定攻击防护:用户登录后生成新 Session ID。
• 并发会话控制:限制同一账号的并发登录数。
• 会话超时:配置会话过期时间。
配置示例:
http.sessionManagement(session -> session
.maximumSessions(1) // 最多 1 个并发会话
.expiredUrl("/login?expired")
);
5. OAuth2/OpenID Connect 集成
作用:支持快速集成第三方登录(如 Google、GitHub)和资源服务器。
核心模块:
• OAuth2 Client:处理第三方登录流程(如 authorization_code
模式)。
• OAuth2 Resource Server:验证 JWT 令牌并保护 API。
典型配置:
spring:
security:
oauth2:
client:
registration:
github:
client-id: your-client-id
client-secret: your-secret
resourceserver:
jwt:
issuer-uri: https://auth-server-url
6. 方法级安全(Method Security)
作用:通过注解在方法层面控制权限。
关键注解:
• @Secured
:基于角色检查(如 @Secured("ROLE_ADMIN")
)。
• @RolesAllowed
(JSR-250 标准):类似 @Secured
。
启用方法级安全:
@Configuration
@EnableMethodSecurity
public class MethodSecurityConfig {}
7. 响应式安全(Reactive Security)
作用:为 WebFlux 应用提供响应式安全支持。
核心类:
• ReactiveUserDetailsService
:响应式加载用户信息。
• ServerSecurityContextRepository
:管理安全上下文。
示例配置:
@Bean
SecurityWebFilterChain securityFilterChain(ServerHttpSecurity http) {
return http
.authorizeExchange(ex -> ex.pathMatchers("/admin").hasRole("ADMIN"))
.formLogin(Customizer.withDefaults())
.build();
}
8. LDAP/AD 集成
作用:与企业级目录服务(如 LDAP、Active Directory)集成。
关键依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-ldap</artifactId>
</dependency>
配置示例:
@Bean
LdapContextSource contextSource() {
LdapContextSource ctx = new LdapContextSource();
ctx.setUrl("ldap://ldap-server:389");
ctx.setUserDn("cn=admin,dc=example,dc=com");
ctx.setPassword("admin-password");
return ctx;
}
9. 扩展与自定义
作用:灵活适配业务需求。
常见扩展点:
• 自定义 UserDetails
对象:添加额外用户字段(如手机号、部门)。
• 自定义权限规则:实现 PermissionEvaluator
接口。
• 动态权限管理:结合数据库动态加载 URL 权限规则。
示例:
public class CustomUser extends User {
private String phone;
// 构造方法、Getter/Setter
}
小结
Spring Security 的核心价值在于:
- 模块化设计:按需选择功能(如 OAuth2、方法级安全)。
- 深度集成:与 Spring 生态无缝协作(如 Spring Boot、Spring Data)。
- 高度可扩展:通过自定义组件满足复杂场景需求。
如果需要某个功能的详细实现(如动态权限管理或 JWT 增强),可进一步探讨!
自带认证机制:
Spring Security 深度集成了多种主流认证机制,适用于不同场景的安全需求。以下是其支持的核心认证方式及其应用场景:
1. 表单登录(Form Login)
场景:传统 Web 应用的账号密码登录。
核心组件:
• UsernamePasswordAuthenticationFilter
:处理表单提交的账号密码。
• UserDetailsService
:从数据库或内存加载用户信息。
配置示例:
http.formLogin(form -> form
.loginPage("/login") // 自定义登录页
.defaultSuccessUrl("/home")
);
2. HTTP Basic 认证
场景:简单的 API 认证(如测试环境)。
特点:通过 Authorization: Basic [base64]
头传递用户名密码。
配置:
http.httpBasic(Customizer.withDefaults());
3. OAuth2.0
OAuth2 客户端(第三方登录)
场景:集成 Google、GitHub 等第三方登录。
配置:
spring:
security:
oauth2:
client:
registration:
github:
client-id: your-id
client-secret: your-secret
scope: user:email
OAuth2 资源服务器(JWT 验证)
场景:保护 API 资源,验证 JWT 令牌。
配置:
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: https://auth-server
4. LDAP/Active Directory
场景:企业内网系统集成 LDAP 或 AD 目录服务。
核心依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-ldap</artifactId>
</dependency>
配置示例:
@Bean
LdapContextSource contextSource() {
LdapContextSource ctx = new LdapContextSource();
ctx.setUrl("ldap://ldap.example.com");
return ctx;
}
5. 数据库用户认证
场景:自定义用户表存储账号密码(如 MySQL、PostgreSQL)。
核心组件:
• UserDetailsService
:实现从数据库加载用户。
• PasswordEncoder
:加密密码(如 BCrypt)。
示例:
@Bean
UserDetailsService userDetailsService(UserRepository repo) {
return username -> repo.findByUsername(username).asUser();
}
6. JWT(JSON Web Token)
场景:无状态 API 认证(前后端分离架构)。
实现方式:
• 自定义过滤器验证请求头中的 Bearer
令牌。
• 使用 jjwt
库生成/解析 JWT。
过滤器示例:
public class JwtAuthFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {
String token = extractToken(request);
if (tokenValid(token)) {
SecurityContextHolder.getContext().setAuthentication(createAuth(token));
}
chain.doFilter(request, response);
}
}
7. Remember-Me 自动登录
场景:用户长时间免登录(基于 Cookie)。
配置:
http.rememberMe(remember -> remember
.tokenRepository(persistentTokenRepository())
.tokenValiditySeconds(86400 * 30) // 30 天
);
8. CAS(单点登录)
场景:多系统共享登录状态。
核心依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-cas</artifactId>
</dependency>
配置流程:
- 用户访问应用 → 重定向到 CAS 登录页。
- 登录成功后,CAS 签发 Ticket → 应用验证 Ticket 并创建会话。
9. SAML 2.0
场景:企业级单点登录(SSO)。
核心依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-saml2-service-provider</artifactId>
</dependency>
配置:
spring:
security:
saml2:
relyingparty:
registration:
okta:
identityprovider:
entity-id: your-idp-entity-id
singlesignon.url: https://idp/sso
10. WebAuthn(FIDO2)
场景:无密码认证(如生物识别、硬件密钥)。
支持方式:通过 Spring Security 实验性模块或第三方库(如 WebAuthn4J
)。
11. Kerberos/SPNEGO
场景:企业内网 Windows 域认证(自动登录)。
配置:
http
.exceptionHandling().authenticationEntryPoint(spnegoEntryPoint())
.and()
.addFilterBefore(spnegoFilter(), BasicAuthenticationFilter.class);
12. 多因素认证(MFA)
场景:高安全要求的系统(如银行应用)。
实现方式:
• 结合短信验证码、TOTP(如 Google Authenticator)与密码认证。
• 自定义 AuthenticationProvider
链式验证多个凭证。
认证机制对比表
认证方式 | 适用场景 | 协议/标准 | 无状态支持 | 复杂度 |
---|---|---|---|---|
表单登录 | 传统 Web 应用 | HTTP | ❌ | 低 |
OAuth2.0 | 第三方登录/API 保护 | OAuth2.0 | ✔️ | 中高 |
JWT | 无状态 API | JWT | ✔️ | 中 |
LDAP/AD | 企业内网系统 | LDAP 协议 | ❌ | 高 |
SAML 2.0 | 企业级 SSO | SAML 2.0 | ✔️ | 高 |
WebAuthn | 无密码认证 | FIDO2/WebAuthn | ✔️ | 高 |
扩展建议
• 混合认证:同时支持表单登录和 OAuth2.0(如 /login/form
和 /login/oauth2
)。
• 动态权限:结合数据库动态管理 URL 或方法级权限。
• 自定义认证:实现 AuthenticationProvider
适配企业遗留系统。