web-dev-qa-db-fra.com

Quand utiliser antMatcher () de Spring Security?

Quand utilisons-nous antMatcher() vs antMatchers()?

Par exemple:

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

Ce que j'attends, c'est

  • Toute demande correspondant à /high_level_url_A/** Doit être authentifiée + /high_level_url_A/sub_level_1 Uniquement pour USER et /high_level_url_A/sub_level_2 Uniquement pour USER2
  • Toute demande correspondant à /high_level_url_B/** Doit être authentifiée + /high_level_url_B/sub_level_1 Pour l'accès public et /high_level_url_A/sub_level_2 Uniquement pour USER3.
  • Tout autre motif qui m'importe peu - mais devrait être public?

J'ai vu les derniers exemples n'incluent pas antMatcher() ces jours-ci. Pourquoi donc? Est-ce que antMatcher() n'est plus nécessaire?

35
sura2k

Vous avez besoin de antMatcher pour plusieurs HttpSecurity , voir référence de sécurité Spring :

5.7 Multiple HttpSecurity

Nous pouvons configurer plusieurs instances HttpSecurity tout comme nous pouvons avoir plusieurs <http> blocs. La clé est d'étendre le WebSecurityConfigurationAdapter plusieurs fois. Par exemple, voici un exemple de configuration différente pour les URL commençant par /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 Configurez l'authentification comme d'habitude

2 Créez une instance de WebSecurityConfigurerAdapter contenant @Order pour spécifier quel WebSecurityConfigurerAdapter devrait être considéré en premier.

3 Le http.antMatcher indique que ce HttpSecurity ne sera applicable qu'aux URL commençant par /api/

4 Créez une autre instance de WebSecurityConfigurerAdapter. Si l'URL ne commence pas par /api/ cette configuration sera utilisée. Cette configuration est considérée après ApiWebSecurityConfigurationAdapter car elle a un @Order valeur après 1 (non @Order par défaut, dernier).

Dans votre cas, vous n'avez pas besoin de antMatcher , car vous n'avez qu'une seule configuration. Votre code modifié:

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

Je mets à jour ma réponse ...

antMatcher() est une méthode de HttpSecurity, elle n'a rien à voir avec authorizeRequests(). Fondamentalement, http.antMatcher() indique à Spring de ne configurer que HttpSecurity si le chemin correspond à ce modèle.

La authorizeRequests().antMatchers() est ensuite utilisée pour appliquer une autorisation à un ou plusieurs chemins spécifiés dans antMatchers(). Tels que permitAll() ou hasRole('USER3'). Ceux-ci ne sont appliqués que si la première http.antMatcher() est appariée.

33
Patrick Grimard

En gros, http.antMatcher() indique à Spring de ne configurer que HttpSecurity si le chemin correspond à ce modèle.

2
Darshan