Spring Boot 安全技能

100 0 更新时间: 2026-07-15 14:46:23

Spring Boot Security 是一个基于 Spring Boot 的安全框架技能,用于构建安全、健壮的应用程序。它提供了认证、授权、加密、会话管理等核心安全功能,支持多种认证方式(如 JWT、OAuth2、LDAP),并集成了 Spring Security 的最佳实践。该技能适用于需要快速实现用户认证和权限控制的 Web 应用、微服务或 API 网关场景,帮助开发者减少安全漏洞,提升系统防护能力。通过配置文件和注解即可灵活定制安全策略,降低开发复杂度。

安装
bunx skills add https://github.com/affaan-m/ECC.git --skill springboot-security
技能详情 readonly

一、技能概述

该技能为 Spring Boot 应用提供了一套系统化的安全审查框架,从认证授权到生产部署,覆盖了 Java Spring Boot 服务的各个安全维度。它既是一份可操作的安全检查清单,也是一套编码规范。

核心原则:默认拒绝、验证输入、最小权限、配置驱动安全


二、核心功能

1. 认证(Authentication)

最佳实践 说明
Token 策略 优先使用无状态 JWT 或带撤销列表的不透明令牌
Cookie 安全 会话使用 httpOnlySecureSameSite=Strict 属性的 Cookie
Token 验证 通过 OncePerRequestFilter 或资源服务器验证令牌
java
@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,依赖无状态认证
java
http.csrf(csrf -> csrf.disable())
    .sessionManagement(sm -> 
        sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS));

6. 密钥管理(Secret Management)

  • 绝不在源代码中包含密钥

  • 从环境变量或 Vault 中读取

  • application.yml 中不存放凭证,使用占位符

  • 定期轮换令牌和数据库凭证

7. 安全标头(Security Headers)

java
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 已启用速率限制

  • 依赖已扫描且为最新

  • 日志中无敏感数据


四、主要用途

  1. 新项目安全基线 —— Spring Boot 项目初始化时建立完整安全防护体系

  2. 安全审计与代码审查 —— 对照清单检查认证、授权、输入验证等常见漏洞

  3. 生产部署前检查 —— 逐项确认安全措施已就位

  4. 团队安全培训 —— 作为 Spring Boot 开发团队的安全编码规范参考


五、重要原则

  1. 默认拒绝 —— 未明确允许的一律拒绝

  2. 验证输入 —— 所有用户输入必须经过验证

  3. 最小权限 —— 仅授予完成任务所需的最低权限

  4. 配置驱动 —— 优先通过配置实现安全,而非硬编码

  5. 密钥不入库 —— 所有密钥使用环境变量或 Vault

  6. 日志脱敏 —— 绝不记录密码、令牌或 PII


六、总结

Spring Boot Security 是一套完整的 Spring Boot 应用安全最佳实践技能,覆盖认证、授权、输入验证、SQL 注入防护、CSRF 防护、密钥管理、安全标头、速率限制、依赖安全、日志脱敏和文件上传安全等 11 个核心领域。它提供了清晰的代码示例和逐项验证的发布前检查清单,适用于新项目安全基线、代码审计、生产部署前检查和团队安全培训等场景。