1. ホーム
  2. spring-mvc

[解決済み] Spring SecurityのantMatcher()はいつ使うのか?

2022-03-12 23:08:38

質問

どのような場合に antMatcher()antMatchers() ?

例えば

http
   .antMatcher("/high_level_url_A/**")
   .authorizeRequests()
      .antMatchers("/high_level_url_A/sub_level_1").hasRole('USER')
      .antMatchers("/high_level_url_A/sub_level_2").hasRole('USER2')
      .somethingElse()
      .anyRequest().authenticated()
      .and()
   .antMatcher("/high_level_url_B/**")
   .authorizeRequests()
      .antMatchers("/high_level_url_B/sub_level_1").permitAll()
      .antMatchers("/high_level_url_B/sub_level_2").hasRole('USER3')
      .somethingElse()
      .anyRequest().authenticated()
      .and()
   ...

ここで期待することは

  • にマッチするリクエストはすべて /high_level_url_A/** は認証される必要があります +。 /high_level_url_A/sub_level_1 のみで、USERと /high_level_url_A/sub_level_2 USER2のみ
  • にマッチするリクエストはすべて /high_level_url_B/** は認証される必要があります +。 /high_level_url_B/sub_level_1 一般公開用と /high_level_url_A/sub_level_2 はUSER3のみ。
  • 他のパターンは気にしない - しかし、公開する必要がありますか?

最近の例では antMatcher() 最近は なぜでしょう?それは antMatcher() は不要になったのでしょうか?

解決方法は?

必要なのは antMatcher 複数の HttpSecurity を参照してください。 Spring Security リファレンス :

5.7 複数のHttpSecurity

複数のHttpSecurityインスタンスを設定することができます。 <http> ブロックがあります。重要なのは WebSecurityConfigurationAdapter を複数回実行します。例えば、以下のように、URLの先頭が /api/ .

@EnableWebSecurity
public class MultiHttpSecurityConfig {
  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) { 1
      auth
          .inMemoryAuthentication()
              .withUser("user").password("password").roles("USER").and()
              .withUser("admin").password("password").roles("USER", "ADMIN");
  }

  @Configuration
  @Order(1)                                                        2
  public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
      protected void configure(HttpSecurity http) throws Exception {
          http
              .antMatcher("/api/**")                               3
              .authorizeRequests()
                  .anyRequest().hasRole("ADMIN")
                  .and()
              .httpBasic();
      }
  }    

  @Configuration                                                   4
  public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

      @Override
      protected void configure(HttpSecurity http) throws Exception {
          http
              .authorizeRequests()
                  .anyRequest().authenticated()
                  .and()
              .formLogin();
      }
  }
}

1 通常通り認証の設定を行う

2 インスタンスの作成 WebSecurityConfigurerAdapter を含む @Order を指定することで、どの WebSecurityConfigurerAdapter が最初に考慮されるべきです。

3は http.antMatcher は、この HttpSecurity で始まるURLに対してのみ適用されます。 /api/

のインスタンスをもう一つ作成します。 WebSecurityConfigurerAdapter . URLの先頭が /api/ この設定が使用されます。このコンフィギュレーションは ApiWebSecurityConfigurationAdapter を持つので @Order の後の値です。 1 (いいえ @Order はデフォルトで最後になります)。

あなたの場合 antMatcher というのも、コンフィギュレーションは1つだけだからです。修正したコード

http
    .authorizeRequests()
        .antMatchers("/high_level_url_A/sub_level_1").hasRole('USER')
        .antMatchers("/high_level_url_A/sub_level_2").hasRole('USER2')
        .somethingElse() // for /high_level_url_A/**
        .antMatchers("/high_level_url_A/**").authenticated()
        .antMatchers("/high_level_url_B/sub_level_1").permitAll()
        .antMatchers("/high_level_url_B/sub_level_2").hasRole('USER3')
        .somethingElse() // for /high_level_url_B/**
        .antMatchers("/high_level_url_B/**").authenticated()
        .anyRequest().permitAll()