Solución:
Necesitas antMatcher
para múltiples HttpSecurity
, consulte Referencia de seguridad de Spring:
5.7 HttpSecurity múltiple
Podemos configurar múltiples instancias de HttpSecurity al igual que podemos tener múltiples
<http>
bloques. La clave es extender elWebSecurityConfigurationAdapter
varias veces. Por ejemplo, el siguiente es un ejemplo de tener una configuración diferente para las URL que comienzan con/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 Configure la autenticación como de costumbre
2 Cree una instancia de
WebSecurityConfigurerAdapter
eso contiene@Order
para especificar cualWebSecurityConfigurerAdapter
debe considerarse primero.3 El
http.antMatcher
afirma que estoHttpSecurity
solo se aplicará a las URL que comiencen con/api/
4 Cree otra instancia de
WebSecurityConfigurerAdapter
. Si la URL no comienza con/api/
se utilizará esta configuración. Esta configuración se considera despuésApiWebSecurityConfigurationAdapter
ya que tiene un@Order
valor después1
(no@Order
predeterminado para durar).
En tu caso no necesitas antMatcher
, porque solo tiene una configuración. Tu código modificado:
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()
Estoy actualizando mi respuesta …
antMatcher()
es un método de HttpSecurity
, no tiene nada que ver con authorizeRequests()
. Básicamente, http.antMatcher()
le dice a Spring que solo configure HttpSecurity
si la ruta coincide con este patrón.
los authorizeRequests().antMatchers()
luego se utiliza para aplicar la autorización a una o más rutas que especifique en antMatchers()
. Tal como permitAll()
o hasRole('USER3')
. Estos solo se aplican si el primero http.antMatcher()
está emparejado.
Básicamente http.antMatcher()
le dice a Spring que solo configure HttpSecurity
si la ruta coincide con este patrón.