首页 > 解决方案 > 路径参数正则表达式

问题描述

我一直在尝试为 Spring Boot for HttpSecurity 中的特定 API 路径定义一个角色。我的路径基本上如下:

/v3/files/{uuid}?subject=SHARED_WITH_LINK

uuid --> 不是静态的,类似于ACC-1a433a56-d5cf-4185-b55e-7ac75d530b79

可能有额外的路径参数,如:

  1. /v3/files/{uuid}?subject=SHARED_WITH_LINK
  2. /v3/files/{uuid}?size=100&subject=SHARED_WITH_LINK
  3. /v3/files/{uuid}?subject=SHARED_WITH_LINK&sortBy=name&size=100

为了防止对 API 的未经授权的访问,我必须小心正则表达式。正则表达式中必须有“/v3/files/” 。{uuid}”部分可以包含字母数字字符和“-”字符。路径的其余部分必须包含“subject=SHARED_WITH_LINK”

我无法为这种路径格式构建正则表达式,这对我来说有点复杂,正如我所说,我担心未经授权的访问。

你能帮我建立正则表达式吗?

例如,我创建了以下正则表达式(不涵盖上述所有要求):

^/v3/files/[\w\-]*(\?)?$

标签: regexspringspring-bootsecurityspring-security

解决方案


您可以使用以下内容:

^/v3/files/[A-Za-z0-9\-]+\?(?:\w+=\w+&)*subject=SHARED_WITH_LINK(?:&\w+=\w+)*$

演示

笔记:

  • 使用[A-Za-z0-9\-]而不是[\w-]更具限制性(即,拒绝下划线和 Unicode *字母数字)。

    • 使用+量词代替*UUID 字符以避免匹配零长度 UUID。您可能希望使用更高的最小长度(即{n,}),或者如果您的 UUID 格式始终相同(很可能是这种情况),您应该更加明确,并且仅通过使用ACC-[a-z0-9]{8}-(?:[a-z0-9]{4}-){3}[a-z0-9]{12}来匹配该特定格式。
  • 用于\w+=\w+匹配单个参数。您可能希望替换\w为包含您希望参数名称/值支持的任何字符的字符类。

  • 尽管连字符在字符类末尾时不需要转义,但我更喜欢显式转义它,尤其是在考虑安全性时。这可确保在附加更多字符时模式不会中断(或更糟的是,接受不需要的字符)。


* 默认情况下可能禁用 Unicode 支持,但为了安全起见。


推荐阅读