一、技能概述
该技能为 Spring Boot 应用提供了一套系统化的安全审查框架,从认证授权到生产部署,覆盖了 Java Spring Boot 服务的各个安全维度。它既是一份可操作的安全检查清单,也是一套编码规范。
核心原则:默认拒绝、验证输入、最小权限、配置驱动安全。
二、核心功能
1. 认证(Authentication)
| 最佳实践 | 说明 |
|---|---|
| Token 策略 | 优先使用无状态 JWT 或带撤销列表的不透明令牌 |
| Cookie 安全 | 会话使用 httpOnly、Secure、SameSite=Strict 属性的 Cookie |
| Token 验证 | 通过 OncePerRequestFilter 或资源服务器验证令牌 |
@Component
public class JwtAuthFilter extends OncePerRequestFilter {
private final JwtService jwtService;
public JwtAuthFilter(JwtService jwtService) { this.jwtService = jwtService; }
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
String header = request.getHeader(HttpHeaders.AUTHORIZATION);
if (header != null && header.startsWith("Bearer ")) {
String token = header.substring(7);
Authentication auth = jwtService.authenticate(token);
SecurityContextHolder.getContext().setAuthentication(auth);
}
chain.doFilter(request, response);
}
}
2. 授权(Authorization)
-
启用方法级安全:
@EnableMethodSecurity -
使用
@PreAuthorize("hasRole('ADMIN')")或@PreAuthorize("@authz.canEdit(#id)")进行细粒度授权 -
默认拒绝,仅公开必需的作用域
3. 输入验证(Input Validation)
-
在控制器中使用
@Valid配合 Bean Validation -
DTO 中应用约束:
@NotBlank、@Size、自定义验证器 -
渲染前对 HTML 内容进行白名单净化
4. SQL 注入防护(SQL Injection Prevention)
-
使用 Spring Data 仓库或参数化查询
-
原生查询使用
:param绑定,绝不拼接字符串
5. CSRF 防护(CSRF Protection)
| 场景 | 配置 |
|---|---|
| 浏览器会话应用 | 启用 CSRF,在表单/头部包含令牌 |
| 纯 Bearer Token API | 禁用 CSRF,依赖无状态认证 |
http.csrf(csrf -> csrf.disable())
.sessionManagement(sm ->
sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
6. 密钥管理(Secret Management)
-
绝不在源代码中包含密钥
-
从环境变量或 Vault 中读取
-
application.yml中不存放凭证,使用占位符 -
定期轮换令牌和数据库凭证
7. 安全标头(Security Headers)
http.headers(headers -> headers
.contentSecurityPolicy(csp -> csp
.policyDirectives("default-src 'self'"))
.frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin)
.xssProtection(Customizer.withDefaults())
.referrerPolicy(rp ->
rp.policy(ReferrerPolicyHeaderWriter.ReferrerPolicy.NO_REFERRER))
);
8. 速率限制(Rate Limiting)
-
对高成本端点应用 Bucket4j 或网关级限制
-
记录突发流量并发送告警
-
返回带重试提示的
429状态码
9. 依赖安全(Dependency Security)
-
CI 中运行 OWASP Dependency Check / Snyk
-
保持 Spring Boot 和 Spring Security 为受支持版本
-
发现已知 CVE 时使构建失败
10. 日志与 PII 保护(Logging & PII)
-
绝不记录密钥、令牌、密码或完整 PAN 数据
-
对敏感字段进行脱敏
-
使用结构化 JSON 日志
11. 文件上传安全(File Upload)
-
验证文件大小、内容类型和扩展名
-
存储在 Web 根目录之外
-
必要时进行病毒扫描
三、发布前检查清单
在生产部署前,必须逐项确认:
-
认证令牌正确验证且未过期
-
所有敏感路径都有授权守卫
-
所有输入均已验证和净化
-
无字符串拼接的 SQL
-
应用类型对应的 CSRF 防护正确
-
密钥已外部化,未提交到仓库
-
安全标头已配置
-
API 已启用速率限制
-
依赖已扫描且为最新
-
日志中无敏感数据
四、主要用途
-
新项目安全基线 —— Spring Boot 项目初始化时建立完整安全防护体系
-
安全审计与代码审查 —— 对照清单检查认证、授权、输入验证等常见漏洞
-
生产部署前检查 —— 逐项确认安全措施已就位
-
团队安全培训 —— 作为 Spring Boot 开发团队的安全编码规范参考
五、重要原则
-
默认拒绝 —— 未明确允许的一律拒绝
-
验证输入 —— 所有用户输入必须经过验证
-
最小权限 —— 仅授予完成任务所需的最低权限
-
配置驱动 —— 优先通过配置实现安全,而非硬编码
-
密钥不入库 —— 所有密钥使用环境变量或 Vault
-
日志脱敏 —— 绝不记录密码、令牌或 PII
六、总结
Spring Boot Security 是一套完整的 Spring Boot 应用安全最佳实践技能,覆盖认证、授权、输入验证、SQL 注入防护、CSRF 防护、密钥管理、安全标头、速率限制、依赖安全、日志脱敏和文件上传安全等 11 个核心领域。它提供了清晰的代码示例和逐项验证的发布前检查清单,适用于新项目安全基线、代码审计、生产部署前检查和团队安全培训等场景。