spring mvc websecurityconfigureradapter Wann sollte man Spring Security`s antMatcher() verwenden?




spring security websecurityconfigureradapter configure (3)

Wann verwenden wir antMatcher() vs antMatchers() ?

Zum Beispiel:

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()
   ...

Was ich hier erwarte, ist,

  • Jede Anfrage, die mit /high_level_url_A/** /high_level_url_A/sub_level_1 nur für USER + /high_level_url_A/sub_level_1 und nur für USER2 /high_level_url_A/sub_level_2 authentifiziert werden
  • Jede Anfrage, die mit /high_level_url_B/** sollte authentifiziert werden + /high_level_url_B/sub_level_1 für den öffentlichen Zugriff und /high_level_url_A/sub_level_2 nur für USER3.
  • Irgendein anderes Muster ist mir egal - Aber sollte es öffentlich sein?

Ich habe gesehen, dass die neuesten Beispiele antMatcher() nicht antMatcher() . Warum das? Wird antMatcher() nicht mehr benötigt?


Ich aktualisiere meine Antwort ...

antMatcher() ist eine Methode von HttpSecurity und hat nichts mit authorizeRequests() zu tun. Grundsätzlich weist http.antMatcher() Spring an, http.antMatcher() nur zu konfigurieren, wenn der Pfad diesem Muster entspricht.

Mit authorizeRequests().antMatchers() wird dann die Autorisierung auf einen oder mehrere Pfade angewendet, die Sie in antMatchers() . permitAll() Beispiel permitAll() oder hasRole('USER3') . Diese werden nur angewendet, wenn das erste http.antMatcher() übereinstimmt.


Grundsätzlich http.antMatcher() Spring an, HttpSecurity nur zu konfigurieren, wenn der Pfad mit diesem Muster übereinstimmt.


Sie benötigen antMatcher für mehrere HttpSecurity , siehe Spring-Sicherheitsreferenz :

5.7 Multiple HttpSecurity

Wir können mehrere HttpSecurity-Instanzen konfigurieren, genauso wie wir mehrere <http> -Blöcke haben können. Der Schlüssel besteht darin, den WebSecurityConfigurationAdapter mehrfach zu erweitern. Das folgende Beispiel zeigt eine andere Konfiguration für URLs, die mit /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 Konfigurieren Sie die Authentifizierung wie gewohnt

2 Erstellen Sie eine Instanz von WebSecurityConfigurerAdapter , die @Order enthält, um anzugeben, welcher WebSecurityConfigurerAdapter zuerst berücksichtigt werden soll.

3 Der http.antMatcher gibt an, dass diese HttpSecurity nur für URLs gilt, die mit /api/

4 Erstellen Sie eine weitere Instanz von WebSecurityConfigurerAdapter . Wenn die URL nicht mit /api/ beginnt, wird diese Konfiguration verwendet. Diese Konfiguration wird nach ApiWebSecurityConfigurationAdapter da sie nach 1 einen @Order Wert aufweist (standardmäßig ist "no @Order der letzte Wert).

In Ihrem Fall benötigen Sie keinen antMatcher , da Sie nur eine Konfiguration haben. Ihr geänderter Code:

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




spring-security4