You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring SecurityFilterChain正则匹配OAuth2保护指定端点问题

Spring Security OAuth2资源服务器端点正则匹配解决方案

需求明确

需为Spring Security的SecurityFilterChain配置正则规则,仅对以下端点触发OAuth2令牌校验:

  • GET /rest/file/{name}/{guid}
    同时排除另外两个端点的校验要求:
  • GET /rest/file/task/{guid}
  • GET /rest/file/{guid}

原代码问题分析

你之前的正则写法存在两处关键错误:

  1. 正则边界符^、$位置错误:将正则语法符号写进了路径分隔符中,实际路径不存在这些符号,导致无法匹配。
  2. GUID正则自带^和$:拼接后会要求路径中间出现边界符,完全不符合真实路径结构,最终触发403(目标端点未被正确匹配到校验规则,默认拦截逻辑生效)。

解决方案

根据你提出的两种思路,分别提供可直接使用的正则配置:

思路1:匹配{name}不为"task"且后续是合法GUID的路径

这是最简洁的实现方式,核心逻辑为:匹配三段结构的路径(/rest/file/xxx/xxx),其中第二段不是"task",第三段符合GUID格式。

// 定义GUID正则(去掉边界符,用于嵌入完整路径正则)
private static final String REGEX_GUID = "[{]?[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}[}]?";
// 受保护路径的完整正则
private static final String PROTECTED_PATH_REGEX = "^/rest/file/(?!task$)[^/]+/" + REGEX_GUID + "$";

// 配置SecurityFilterChain
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests(auth -> auth
            // 对目标端点要求认证
            .regexMatchers(HttpMethod.GET, PROTECTED_PATH_REGEX).authenticated()
            // 放行另外两个端点
            .regexMatchers(HttpMethod.GET, "/rest/file/task/.*", "/rest/file/" + REGEX_GUID).permitAll()
            // 其他请求默认处理(可根据需求调整)
            .anyRequest().denyAll()
        )
        .oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults()));
    return http.build();
}

思路2:匹配{name}不为"task"且{name}不符合GUID格式的路径

如果需要额外确保{name}本身不是GUID格式(避免和第三个端点混淆),可在正则中添加对{name}的负向预查:

private static final String REGEX_GUID = "[{]?[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}[}]?";
// 增加对name不是GUID的校验
private static final String PROTECTED_PATH_REGEX = "^/rest/file/(?!task$)(?!%s$)[^/]+/%s$".formatted(REGEX_GUID, REGEX_GUID);

// SecurityFilterChain配置同思路1

正则规则说明

  • ^/rest/file/:匹配路径的固定开头
  • (?!task$):负向预查,确保第二段路径({name})不是"task"
  • [^/]+:匹配任意非斜杠字符(即{name}的内容)
  • (?!%s$)(思路2):额外确保{name}本身不符合GUID格式
  • REGEX_GUID:匹配标准格式的GUID,支持带大括号或不带的写法
  • $:匹配路径结尾,确保是完整的三段结构

验证示例

  • 触发校验的路径:/rest/file/aaaaa/123e4567-e89b-12d3-a456-426614174000
  • 直接放行的路径:/rest/file/task/123e4567-e89b-12d3-a456-426614174000、/rest/file/123e4567-e89b-12d3-a456-426614174000

内容的提问来源于stack exchange,提问作者Mr P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 04:13:13