いつ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()
は不要になりましたか?
複数の antMatcher
が必要です HttpSecurity
、 Spring 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()
回答を更新しています...
antMatcher()
はHttpSecurity
のメソッドであり、authorizeRequests()
とは何の関係もありません。基本的に、http.antMatcher()
は、パスがこのパターンに一致する場合にのみHttpSecurity
を構成するようにSpringに指示します。
次に、authorizeRequests().antMatchers()
を使用して、antMatchers()
で指定した1つ以上のパスに許可を適用します。 permitAll()
やhasRole('USER3')
など。これらは、最初のhttp.antMatcher()
が一致した場合にのみ適用されます。
基本的に、http.antMatcher()
は、パスがこのパターンに一致する場合にのみHttpSecurity
を構成するようにSpringに指示します。