用途
Spring Boot Security 是一份针对 Java Spring Boot 服务的 Spring Security 最佳实践参考,用于在开发过程中加固认证、授权、输入处理、密钥管理、安全响应头、限流和依赖安全等环节。资料建议在以下场景启用:添加认证(JWT、OAuth2、基于会话)、实现授权(@PreAuthorize、基于角色的访问)、校验用户输入(Bean Validation、自定义校验器)、配置 CORS、CSRF 或安全响应头、管理密钥(Vault、环境变量)、添加限流或暴力破解防护、扫描依赖中的 CVE。
主要能力
认证
- 优先使用无状态 JWT 或不透明令牌并配合吊销列表。
- 会话使用 httpOnly、Secure、SameSite=Strict 的 Cookie。
- 通过 OncePerRequestFilter 或资源服务器校验令牌。资料给出了 JwtAuthFilter 示例,从 Authorization 头提取 Bearer 令牌并设置 SecurityContext。
授权
- 启用方法级安全:@EnableMethodSecurity。
- 使用 @PreAuthorize("hasRole('ADMIN')") 或 @PreAuthorize("@authz.canEdit(#id)")。
- 默认拒绝,仅暴露必要的 scope。资料给出了 AdminController 示例,对 listUsers 使用 hasRole('ADMIN'),对 deleteUser 使用 @authz.isOwner(#id, authentication)。
输入校验
- 在控制器上使用 @Valid 配合 Bean Validation。
- 在 DTO 上应用 @NotBlank、@Email、@Size 及自定义校验器。
- 渲染前对 HTML 使用白名单进行净化。资料对比了无校验的 createUser 与使用 CreateUserDto 记录并带约束注解的写法。
SQL 注入防护
- 使用 Spring Data 仓库或参数化查询。
- 原生查询使用 :param 绑定,绝不拼接字符串。资料给出了错误示例(字符串拼接)与正确示例(@Query 使用 :name 绑定、Spring Data 派生查询)。
密码编码
- 始终使用 BCrypt 或 Argon2 哈希密码,绝不存储明文。
- 使用 PasswordEncoder bean,而非手动哈希。资料示例为 new BCryptPasswordEncoder(12),成本因子 12。
CSRF 防护
- 浏览器会话应用保持 CSRF 启用,在表单/请求头中包含令牌。
- 纯 API 使用 Bearer 令牌时禁用 CSRF,依赖无状态认证。资料给出了禁用 CSRF 并设置 SessionCreationPolicy.STATELESS 的配置。
密钥管理
- 源码中不得包含密钥,从环境变量或 vault 加载。
- application.yml 不含凭据,使用占位符。
- 定期轮换令牌和数据库凭据。资料对比了硬编码密码与 ${DB_PASSWORD} 占位符、Spring Cloud Vault 集成配置。
安全响应头
资料给出了通过 http.headers 配置 Content-Security-Policy(default-src 'self')、frameOptions sameOrigin、xssProtection、referrerPolicy NO_REFERRER 的示例。
CORS 配置
- 在安全过滤器层配置 CORS,而非按控制器配置。
- 限制允许的来源,生产环境绝不使用 *。资料给出了 CorsConfigurationSource bean 示例,设置 allowedOrigins、allowedMethods、allowedHeaders、allowCredentials、maxAge,并在 SecurityFilterChain 中通过 http.cors 引用。
限流
- 对昂贵接口应用 Bucket4j 或网关级限制。
- 对突发流量记录并告警,返回 429 并附带重试提示。资料给出了 RateLimitFilter 示例,按客户端 IP 使用 Bucket4j 限制每分钟 100 次,超出返回 429 与错误 JSON。
依赖安全
- 在 CI 中运行 OWASP Dependency Check / Snyk。
- 保持 Spring Boot 与 Spring Security 在受支持版本。
- 对已知 CVE 使构建失败。
日志与 PII
- 绝不记录密钥、令牌、密码或完整 PAN 数据。
- 脱敏敏感字段,使用结构化 JSON 日志。
文件上传
- 校验大小、内容类型和扩展名。
- 存储在 web 根目录之外;必要时进行扫描。
使用方式
资料以代码示例和配置片段的形式给出实践建议,涵盖过滤器、控制器、配置类、application.yml 等。开发者可在添加认证、处理输入、创建接口或管理密钥时对照这些示例进行实现。发布前可参照资料末尾的检查清单逐项核对。
适用场景
适用于 Java Spring Boot 服务的安全加固,尤其是需要实现认证授权、输入校验、CSRF/CORS 配置、密钥外置、限流和依赖扫描的项目。
限制
资料未提供具体的安装命令、版本要求、收费信息或平台支持范围。部分内容(如 OAuth2、Vault 集成)仅提及方向,未展开完整配置。