Spring Security の最新バージョンのパス マッチング スキーム!

@[toc] Spring Security は、Spring ベースのアプリケーションを保護するための完全なソリューションを提供する、強力で高度にカスタマイズ可能なセキュリティ フレームワークです。 Spring Security では、パスのマッチングはアクセス許可制御の中核部分であり、どのリクエストが特定のリソースにアクセスできるかを決定します。この記事では、Spring Security のパス マッチング戦略を詳細に紹介し、対応するコード例を示します。

Spring Security の古いバージョンにはパス一致メソッドが多数ありましたが、Spring Security の新しいバージョンではこれらのメソッドが均一にカプセル化され、処理のために requestMatchers メソッドが呼び出されます。

public C requestMatchers(RequestMatcher... requestMatchers) {
	Assert.state(!this.anyRequestConfigured, "Can't configure requestMatchers after anyRequest");
	return chainRequestMatchers(Arrays.asList(requestMatchers));
}

requestMatchers メソッドは、RequestMatcher 型のパラメーターを受け取ります。このインターフェイスは、HTTP リクエストが指定されたパターンに一致するかどうかを判断するために使用されるツールです。このインターフェイスは、要求一致ルールを定義する柔軟な方法を提供するため、さまざまな要求に対してさまざまなセキュリティ ポリシーを実装できます。

そのため、Spring Security の新しいバージョンでは、異なるパス マッチング サブスキームは、実際には RequestMatcher の異なる実装クラスになります。

1.AntPathRequestMatcher

AntPathRequestMatcherSpring で最もよく使用されるリクエスト マッチャーの 1 つであり、Ant スタイルのパス パターンを使用してリクエスト URI を照合します。

1.1 Ant スタイルのパス パターンとは

Ant スタイルのパス マッチング (Ant Path Matching) は、Java ビルド ツール Apache Ant に由来する、リソースの場所のパターン マッチング ルールです。 Ant では、このモードはファイル システム内のファイルとディレクトリを指定するために使用されます。 Ant スタイルのパス パターンは、そのシンプルさと柔軟性により、Spring Security を含む他の多くのフレームワークやアプリケーションでも採用されています。

Ant スタイルのパス パターンでは、いくつかの特殊文字を使用して、さまざまなレベルのパス一致を表します。

  1. ?: 任意の 1 文字と一致します (パス区切り文字を除く)。

  2. *: 空の文字列を除く、任意の文字のシーケンス (パス区切り文字を除く) と一致します。

  3. **: 空の文字列を含む任意の文字シーケンスと一致します。少なくとも 1 つの文字のシーケンスと一致し、パス区切り文字にまたがることもできます。

  4. {}: 複数のカンマ区切りのパターンに一致するワイルドカードの選択を示します。たとえば、{,春夏秋冬}春、夏、秋、冬で始まる任意の文字列を照合できます。

  5. []: 一部の実装では、かっこ内の単一文字と一致するために使用できます。

  6. (): 一部の実装では、グループのマッチングに使用できます。

Spring Security では、URL パスとセキュリティ構成の間のマッピングを定義するために、Ant スタイルのパス パターンがよく使用されます。たとえば、Ant スタイルのパス パターンを使用して、特定の権限やロールが必要な URL パスを指定できます。

Ant スタイルのパス パターンの例をいくつか示します。

  • /users/*:または/users/など、 で始まる任意のパスと一致します/users/123/users/profile

  • /users/**:または/users/などのサブパスを含む、 で始まる任意のパスと一致します/users/123/users/profile/picture

  • /users/123: 完全に一致/users/123

  • /users/{id}: これは Ant スタイルのパターンではありませんが/users/123/users/456などに一致するパス パラメーターの一致を示しています。

  • /files/**.{jpg,png}:またはなど、 orで終わる/files/すべてのファイル パスと一致します.jpg.png/files/image1.jpg/files/folder/image.png

Ant スタイルのパス パターンを使用すると、複雑な URL 一致ルールを柔軟に定義して、さまざまなセキュリティ要件に適応できます。

1.2 基本的な使い方

import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

// 创建 AntPathRequestMatcher 实例
RequestMatcher antMatcher = new AntPathRequestMatcher("/users/**", "GET");

// 使用 matcher 进行匹配
boolean isMatch = antMatcher.matches(request);

1.3 ワイルドカード

  • ?任意の 1 文字と一致します。
  • *任意の文字シーケンスと一致します (ただし、ディレクトリ区切り文字は一致しません)。
  • **ディレクトリ区切り文字を含む任意の文字シーケンスと一致します。
// 匹配 /admin 下的任何资源,包括子目录
RequestMatcher adminMatcher = new AntPathRequestMatcher("/admin/**");

// 匹配 /files 目录下的任何 HTML 文件
RequestMatcher fileMatcher = new AntPathRequestMatcher("/files/*.{html,htm}", "GET");

2. RegexRequestMatcher

RegexRequestMatcher正規表現を使用して、要求された URI と HTTP メソッドを照合します。

2.1 基本的な使い方

import org.springframework.security.web.util.matcher.RegexRequestMatcher;

// 创建 RegexRequestMatcher 实例
RequestMatcher regexMatcher = new RegexRequestMatcher("^/api/.*", "GET");

// 使用 matcher 进行匹配
boolean isMatch = regexMatcher.matches(request);

2.2 正規表現の使用

// 匹配任何以 /api 开头的 URI
RequestMatcher apiMatcher = new RegexRequestMatcher("^/api/.*");

// 匹配任何 HTTP 方法
RequestMatcher anyMethodMatcher = new RegexRequestMatcher("^/.*", "GET|POST|PUT|DELETE");

2.3 Spring Securityとの組み合わせ

次のコードは、html、css、および js で終わるすべてのリクエストをインターセプトします。これらのリクエストには直接アクセスできます。

@Configuration
public class SecurityConfig {

    @Bean
    SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests(a -> a.requestMatchers(new RegexRequestMatcher("^.*\\.(htm|css|js)$","GET")).permitAll())
                .formLogin(Customizer.withDefaults())
                .csrf(c -> c.disable());
        return http.build();
    }
}

3.RequestHeaderRequestMatcher

RequestHeaderRequestMatcherリクエストヘッダー内のキーと値を照合するために使用されます。

import org.springframework.security.web.util.matcher.RequestHeaderRequestMatcher;

// 创建 RequestHeaderRequestMatcher 实例
RequestMatcher headerMatcher = new RequestHeaderRequestMatcher("User-Agent", "Mozilla.*");

// 使用 matcher 进行匹配
boolean isMatch = headerMatcher.matches(request);

具体的に Spring Security では、使用法は次のとおりです。

@Configuration
public class SecurityConfig {

    @Bean
    SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests(a -> a.requestMatchers(new RequestHeaderRequestMatcher("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36")).permitAll())
                .formLogin(Customizer.withDefaults())
                .csrf(c -> c.disable());
        return http.build();
    }
}

4. NegatedRequestMatcher

NegatedRequestMatcher既存の一致を無効にすることができますRequestMatcher

import org.springframework.security.web.util.matcher.NegatedRequestMatcher;

// 创建一个 matcher,然后否定它的匹配结果
RequestMatcher notAdminMatcher = new NegatedRequestMatcher(adminMatcher);

// 使用 negated matcher 进行匹配
boolean isNotMatch = notAdminMatcher.matches(request);

たとえば、次のコードは/hello、 を除くすべてのアドレスに直接アクセスできることを示しています。

@Configuration
public class SecurityConfig {

    @Bean
    SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests(a -> a.requestMatchers(new NegatedRequestMatcher(new AntPathRequestMatcher("/hello"))).permitAll())
                .formLogin(Customizer.withDefaults())
                .csrf(c -> c.disable());
        return http.build();
    }
}

5. AndRequestMatcher と OrRequestMatcher

AndRequestMatcherと はOrRequestMatcherそれぞれ、複数のRequestMatcherインスタンスを結合して「AND」または「OR」の論理一致を実行するために使用されます。

5.1 AndRequestMatcher

import org.springframework.security.web.util.matcher.AndRequestMatcher;

// 组合多个 matcher 进行“与”匹配
RequestMatcher andMatcher = new AndRequestMatcher(apiMatcher, headerMatcher);

// 使用 andMatcher 进行匹配
boolean isMatch = andMatcher.matches(request);

5.2 OrRequestMatcher

import org.springframework.security.web.util.matcher.OrRequestMatcher;

// 组合多个 matcher 进行“或”匹配
RequestMatcher orMatcher = new OrRequestMatcher(adminMatcher, fileMatcher);

// 使用 orMatcher 进行匹配
boolean isMatch = orMatcher.matches(request);

6. まとめ

RequestMatcherSpring は、さまざまなリクエスト一致のニーズを満たすさまざまな実装クラスを提供します。これらのマッチャーを適切に使用することで、セキュリティ ポリシーを柔軟に定義および実装できます。実際のアプリケーションでは、ビジネス要件に基づいて適切なマッチャーを選択し、それを Spring Security 構成と組み合わせて、きめ細かいアクセス制御を実装する必要がある場合があります。

ライナスは、カーネル開発者がタブをスペースに置き換えるのを防ぐことに自ら取り組みました。 彼の父親はコードを書くことができる数少ないリーダーの 1 人であり、次男はオープンソース テクノロジー部門のディレクターであり、末息子はオープンソース コアです。寄稿者Robin Li: 自然言語 新しいユニバーサル プログラミング言語になるでしょう。オープン ソース モデルは Huawei にますます後れをとっていきます 。一般的に使用されている 5,000 のモバイル アプリケーションを Honmeng に完全に移行するには 1 年かかります。 リッチテキスト エディタ Quill 2.0 リリースされ、機能、信頼性、開発者は「恨みを取り除く ために握手を交わしました。 Laoxiangji のソースはコードではありませんが、その背後にある理由は非常に心温まるものです。Googleは大規模な組織再編を発表しました。
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/lenve/blog/11053987
おすすめ