web-dev-qa-db-ja.com

Spring SecurityのantMatcher()を使用する場合

いつantMatcher() vs 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、USER3の場合は/high_level_url_A/sub_level_2のみ。
  • 私が気にしない他のパターン-しかし、公開すべきですか?

最近の例にはantMatcher()が含まれていません。何故ですか? antMatcher()は不要になりましたか?

35
sura2k

複数の antMatcher が必要です HttpSecuritySpring Security Reference を参照してください:

5.7複数のHttpSecurity

複数の<http>ブロックを持つことができるように、複数のHttpSecurityインスタンスを構成できます。重要なのは、WebSecurityConfigurationAdapterを複数回拡張することです。たとえば、次は/api/で始まるURLの別の設定の例です。

@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 @Orderを含むWebSecurityConfigurerAdapterのインスタンスを作成して、最初に考慮するWebSecurityConfigurerAdapterを指定します。

3 http.antMatcherは、このHttpSecurity/api/で始まるURLにのみ適用可能であることを示しています

4 WebSecurityConfigurerAdapterの別のインスタンスを作成します。 URLが/api/で始まらない場合、この構成が使用されます。この構成は、@Orderの後に1値があるため、ApiWebSecurityConfigurationAdapterの後に考慮されます(@Orderのデフォルトは最後になりません)。

構成が1つしかないため、 antMatcher は必要ありません。変更したコード:

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()
51
dur

回答を更新しています...

antMatcher()HttpSecurityのメソッドであり、authorizeRequests()とは何の関係もありません。基本的に、http.antMatcher()は、パスがこのパターンに一致する場合にのみHttpSecurityを構成するようにSpringに指示します。

次に、authorizeRequests().antMatchers()を使用して、antMatchers()で指定した1つ以上のパスに許可を適用します。 permitAll()hasRole('USER3')など。これらは、最初のhttp.antMatcher()が一致した場合にのみ適用されます。

33
Patrick Grimard

基本的に、http.antMatcher()は、パスがこのパターンに一致する場合にのみHttpSecurityを構成するようにSpringに指示します。

2
Darshan