返回 Bug 清单
BUG-0404project-13高已修复security-cors

Spring Security 首个匹配生效:显式 permitAll 与「非 /api 前缀即放行」的兜底规则叠加,使 /v3/api-docs 匿名可访问

发现:2026-10-03验证:2026-10-09置信度:90%

症状

未登录即可拉取完整 OpenAPI 文档,暴露全部接口清单与参数结构,为攻击者提供完整攻击面地图。

根因

SecurityConfig 里同时存在:为 springdoc 显式配置的 permitAll,以及一条把「所有不以 /api 开头的请求」放行的静态资源兜底规则。Spring Security 的匹配是「首个命中即生效」,因此只要兜底规则排在前面,显式的限制就永远不会被求值,接口文档对匿名用户完全敞开。

修复方案

把限制规则插在静态资源兜底规则【之前】:requestMatchers("/v3/api-docs", "/v3/api-docs/**", "/v3/api-docs.yaml").hasRole("ADMIN");requestMatchers("/swagger-ui/**", "/swagger-ui.html", "/swagger-resources/**", "/webjars/**").hasAnyRole("USER","ADMIN");并同时覆盖带 /api 前缀的变体。验证:匿名必须 401,ADMIN 必须 200。

错误签名

GET /v3/api-docs 匿名返回 200 且 517KB 完整 OpenAPI(433 路径 / 460 操作)

技术信息

来源项目

project-13

涉及文件

backend/src/main/java/com/project-13/config/SecurityConfig.java

标签

Spring Security, 规则顺序, 接口文档泄漏, 首个匹配, project-13...