构建健壮、可安全交付的 Spring Boot 应用,需要将安全防护、测试驱动开发(TDD)与自动化发布前验证三者结合,形成从编码到部署的全链路质量保障。本文基于 Everything Claude Code 的 springboot-securityspringboot-tddspringboot-verification 三个 Skill,提供一套可落地的配置与实施指南,覆盖认证授权、测试覆盖率达 80%+ 及 CI/CD 集成的完整工作流。

Spring Boot 安全、TDD 与发布前验证:从 JUnit 5 到 CI/CD 全链路保障

在 AI 辅助编程时代,利用 Claude Code 等工具提升效率的同时,更需要将传统工程纪律——安全、测试与验证——系统性地注入开发流程。借助 Everything Claude Code 提供的专业 Skill 体系,我们可以将安全配置、测试驱动和发布验证标准化,实现从代码生成到生产部署的质量闭环。

本文将串联 springboot-securityspringboot-tddspringboot-verification 三个核心 Skill,详解如何为你的 Spring Boot 项目构建一道贯穿始终的质量防线。

第一部分:安全基座——认证、授权与防护

安全是生产应用的第一道门槛。springboot-security Skill 提供了一套覆盖认证(Authentication)、授权(Authorization)、输入校验、CSRF、速率限制和依赖安全的审查与建议框架。

1. 认证配置:无状态 JWT 与会话管理

对于 API 服务,推荐使用无状态的 JWT 认证。Skill 会审查你的实现,确保使用 OncePerRequestFilter 进行 token 校验,并建议结合黑名单机制支持 token 撤销。

@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);
    }
}

Skill 检查点:token 校验逻辑是否完整,cookie 属性(如 httpOnlySecure)是否安全。

2. 授权与最小权限原则

启用方法级安全,并使用注解强制实施权限检查。Skill 会扫描所有敏感端点,确保均添加了如 @PreAuthorize 的授权注解。

@EnableMethodSecurity
@Configuration
public class SecurityConfig {
    // ... 其他配置
}

@RestController
@RequestMapping("/api/admin")
public class AdminController {

    @PreAuthorize("hasRole('ADMIN')")
    @GetMapping("/users")
    public List<UserDto> listUsers() {
        return userService.findAll();
    }
}

Skill 检查点:是否存在未受保护的端点,权限表达式是否合理。

3. 输入校验与 SQL 注入防护

控制器层强制使用 @Valid,DTO 定义校验约束。所有数据库查询必须参数化。Skill 会高亮任何拼接 SQL 或缺失校验的代码。

public record CreateUserDto(
        @NotBlank @Size(max = 100) String name,
        @NotBlank @Email String email
) {}

@PostMapping("/users")
public ResponseEntity<UserDto> createUser(@Valid @RequestBody CreateUserDto dto) {
    // ...
}

// 使用 @Query 注解确保参数化
@Query("SELECT u FROM User u WHERE u.email = :email")
Optional<User> findByEmail(@Param("email") String email);

Skill 检查点:DTO 是否缺少校验注解,查询是否使用参数化。

4. CSRF、CORS 与安全头

对于浏览器会话应用,需开启 CSRF;纯 API 项目则可关闭。CORS 配置应明确指定允许的源、方法和头,严禁使用通配符 *。Skill 会验证安全头(如 CSP)的配置完整性。

http
    .csrf(csrf -> csrf.disable()) // 纯API项目示例
    .cors(cors -> cors.configurationSource(corsConfigurationSource()))
    .headers(headers -> headers
        .contentSecurityPolicy(csp ->
            csp.policyDirectives("default-src 'self'; script-src 'self'")));

@Bean
public CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowedOrigins(List.of("https://yourdomain.com"));
    config.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE"));
    config.setAllowedHeaders(List.of("Authorization", "Content-Type"));
    config.setAllowCredentials(true);
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/api/**", config);
    return source;
}

Skill 检查点:CORS 源是否过宽,安全头是否缺失。

5. 速率限制与爆破防护

对登录、注册等高风险接口实施限流。Skill 可自动识别未受保护的敏感端点,并建议使用 Bucket4j 等库实现基于 IP 的限流。

@Component
public class RateLimitFilter extends OncePerRequestFilter {
    private final Map<String, Bucket> buckets = new ConcurrentHashMap<>();

    private Bucket createBucket() {
        return Bucket.builder()
                .addLimit(Bandwidth.classic(100,
                        Refill.intervally(100, Duration.ofMinutes(1))))
                .build();
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response,
                                    FilterChain chain)
            throws ServletException, IOException {
        String clientIp = request.getRemoteAddr();
        Bucket bucket = buckets.computeIfAbsent(clientIp, k -> createBucket());
        if (bucket.tryConsume(1)) {
            chain.doFilter(request, response);
        } else {
            response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());
            // 返回 429 状态码
        }
    }
}

6. 依赖安全与敏感信息管理

Skill 会扫描项目配置,确保 secrets(如数据库密码)通过环境变量或 Vault 管理,而非硬编码在 application.yml 中。同时,它鼓励集成 OWASP Dependency Check 或 Snyk,在 CI 阶段阻断含已知 CVE 的依赖。

spring:
  datasource:
    password: ${DB_PASSWORD}

Skill 输出示例

[Spring Boot Security Review]
- [FAIL] /api/login POST 接口未配置速率限制。
- [WARN] application.yml 中检测到明文密码 ‘password: 123456’,请改用环境变量。
- [PASS] 所有敏感API路径已添加 @PreAuthorize 注解。

第二部分:质量引擎——测试驱动开发(TDD)

springboot-tdd Skill 将 JUnit 5、Mockito、MockMvc、Testcontainers 和 JaCoCo 整合为一套标准化的 TDD 流程,确保从单元到集成测试的全覆盖,并强制 80% 以上的行覆盖率。

1. TDD 循环:Fail First -> 最小实现 -> 重构

Skill 会引导你遵循标准的 TDD 节奏。首先为需求生成失败的测试,然后编写最小代码使测试通过,最后在测试保护下进行重构。

2. 多层级测试覆盖

单元测试(JUnit 5 + Mockito):隔离测试 Service、Repository 等组件。

@ExtendWith(MockitoExtension.class)
class MarketServiceTest {
    @Mock MarketRepository repo;
    @InjectMocks MarketService service;

    @Test
    void createsMarket() {
        CreateMarketRequest req = new CreateMarketRequest("name", "desc", Instant.now(), List.of("cat"));
        when(repo.save(any())).thenAnswer(inv -> inv.getArgument(0));

        Market result = service.create(req);

        assertThat(result.name()).isEqualTo("name");
        verify(repo).save(any());
    }
}

Web 层测试(MockMvc):验证 Controller 的 HTTP 交互。

@WebMvcTest(MarketController.class)
class MarketControllerTest {
    @Autowired MockMvc mockMvc;
    @MockBean MarketService marketService;

    @Test
    void returnsMarkets() throws Exception {
        when(marketService.list(any())).thenReturn(Page.empty());

        mockMvc.perform(get("/api/markets"))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.content").isArray());
    }
}

持久化与集成测试(Testcontainers):使用真实数据库容器,确保与生产环境一致。

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Import(TestContainersConfig.class)
class MarketRepositoryTest {
    @Autowired MarketRepository repo;

    @Test
    void savesAndFinds() {
        MarketEntity entity = new MarketEntity();
        entity.setName("Test");
        repo.save(entity);

        Optional<MarketEntity> found = repo.findByName("Test");
        assertThat(found).isPresent();
    }
}

3. 覆盖率强制与 CI 集成

Skill 集成 JaCoCo,在 verify 阶段生成覆盖率报告。覆盖率低于 80% 时,AI 助手会提示补充测试。

<!-- pom.xml -->
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.14</version>
    <executions>
        <execution>
            <goals><goal>prepare-agent</goal></goals>
        </execution>
        <execution>
            <id>report</id>
            <phase>verify</phase>
            <goals><goal>report</goal></goals>
        </execution>
    </executions>
</plugin>

执行命令:mvn verify 即可完成测试与覆盖率检查。

第三部分:发布守门人——六阶段自动化验证循环

springboot-verification Skill 将发布前的质量检查串联为六个自动化阶段,确保每次代码合并或部署前都经过严格审查。

阶段 1:构建(Build)

确保代码能成功编译。

mvn clean verify -DskipTests

阶段 2:静态分析(Static Analysis)

集成 SpotBugs、PMD、Checkstyle,检测潜在缺陷与代码规范。

mvn spotbugs:check pmd:check checkstyle:check

阶段 3:测试与覆盖率(Tests + Coverage)

运行全部测试,并校验覆盖率阈值。

mvn test jacoco:report

阶段 4:安全扫描(Security Scan)

运行依赖漏洞扫描和敏感信息检测。

# 依赖安全
mvn org.owasp:dependency-check-maven:check
# 源码敏感信息扫描(示例)
grep -rn "password\s*=\s*\"" src/ --include="*.java"

阶段 5:代码格式化(Lint/Format,可选)

使用 Spotless 等工具统一代码风格。

mvn spotless:apply

阶段 6:差异审查(Diff Review)

检查本次变更,提醒移除调试日志、验证异常处理等。

git diff --stat

集成与输出

整个循环可一键触发,并在 CI/CD(如 Jenkins、GitHub Actions)中集成。Skill 会生成结构化的验证报告:

VERIFICATION REPORT
===================
Build:     PASS
Static:    PASS
Tests:     PASS (覆盖率: 82%)
Security:  PASS (发现CVE: 0)
Diff:      5 files changed

Overall:   READY FOR MERGE

总结

通过组合 springboot-securityspringboot-tddspringboot-verification 三个 Skill,你可以在 AI 辅助编程环境下,为 Spring Boot 项目建立一套从安全配置、测试保障到发布验证的全自动质量体系。这套体系确保了代码在离开开发者IDE之前,就已经满足了生产环境对安全、可靠性和质量的基本要求,是实现高效、安全 AI 辅助编程的工程化实践典范

FAQ

Q: 这三个 Skill 必须一起使用吗? A: 不必须。它们可以独立启用,分别负责安全、测试或验证。但三者组合使用能形成最完整的质量保障闭环。

Q: 如何在现有的 CI/CD 流水线(如 Jenkins)中集成这些验证阶段? A: springboot-verification Skill 提供的各阶段命令(如 mvn verify, mvn spotbugs:check)均可作为独立的脚本步骤集成到你的 Jenkinsfile 或 GitHub Actions 配置中。

Q: 覆盖率阈值 80% 可以调整吗? A: 可以。在项目的 pom.xml 或 Gradle 配置中,修改 JaCoCo 插件的 rules 配置即可自定义行覆盖率或分支覆盖率的阈值。