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
/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/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.J'ai vu les derniers exemples n'incluent pas antMatcher()
ces jours-ci. Pourquoi donc? Est-ce que antMatcher()
n'est plus nécessaire?
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 leWebSecurityConfigurationAdapter
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 quelWebSecurityConfigurerAdapter
devrait être considéré en premier.3 Le
http.antMatcher
indique que ceHttpSecurity
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èsApiWebSecurityConfigurationAdapter
car elle a un@Order
valeur après1
(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()
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.
En gros, http.antMatcher()
indique à Spring de ne configurer que HttpSecurity
si le chemin correspond à ce modèle.