SpringSecurity(5.1.2)のantMatcherと同じ正規表現チェックのやり方

結論:new AntPathMatcher.match(pattern, path)で出来ます。

antMatcherは以下のような正規表現の書き方になります。(PatternとMatcherによる正規表現とは異なります。)

  • /admin/**
  • /users/{^[\\d]$}/

では、実際にどうやっているのか HttpSecurity.antMatcherメソッドを覗いてみると

public HttpSecurity antMatcher(String antPattern) {
  return requestMatcher(new AntPathRequestMatcher(antPattern));
}

AntPathRequestMatcherのコンストラクタを辿っていくと

public AntPathRequestMatcher(String pattern, String httpMethod,
    boolean caseSensitive, UrlPathHelper urlPathHelper) {
  Assert.hasText(pattern, "Pattern cannot be null or empty");
  this.caseSensitive = caseSensitive;

  if (pattern.equals(MATCH_ALL) || pattern.equals("**")) {
    pattern = MATCH_ALL;
    this.matcher = null;
  }
  else {
    // If the pattern ends with {@code /**} and has no other wildcards or path
    // variables, then optimize to a sub-path match
    if (pattern.endsWith(MATCH_ALL)
        && (pattern.indexOf('?') == -1 && pattern.indexOf('{') == -1
            && pattern.indexOf('}') == -1)
        && pattern.indexOf("*") == pattern.length() - 2) {
      this.matcher = new SubpathMatcher(
          pattern.substring(0, pattern.length() - 3), caseSensitive);
    }
    else {
      this.matcher = new SpringAntMatcher(pattern, caseSensitive);
    }
  }

  this.pattern = pattern;
  this.httpMethod = StringUtils.hasText(httpMethod) ? HttpMethod.valueOf(httpMethod)
      : null;
  this.urlPathHelper = urlPathHelper;
}

パスの最後に”**”が指定されている場合は SubpathMatcher を用いてstartWithによる前方一致の比較を行い、それ以外のケースでは SpringAntMatcher を呼び出していて AntPathMatcher による比較を行うようになっています。ということで AntPathMatcher.match(pattern, path) を使えば同じ正規表現のチェックが行えますよ、という話でした。