spring-mvc - tutorial - spring security ejemplo
¿Cuándo usar el antMatcher() de Spring Security? (3)
¿Cuándo usamos
antMatcher()
vs
antMatchers()
?
Por ejemplo:
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()
...
Lo que espero aquí es
-
Cualquier solicitud que coincida con
/high_level_url_A/**debe autenticarse +/high_level_url_A/sub_level_1solo para USER y/high_level_url_A/sub_level_2solo para USER2 -
Cualquier solicitud que coincida con
/high_level_url_B/**debe autenticarse +/high_level_url_B/sub_level_1para acceso público y/high_level_url_A/sub_level_2solo para USER3. - Cualquier otro patrón que no me importa, ¿pero debería ser público?
He visto que los últimos ejemplos no incluyen
antMatcher()
estos días.
¿Porqué es eso?
¿
antMatcher()
ya no es necesario?
Básicamente,
http.antMatcher()
le dice a Spring que solo configure
HttpSecurity
si la ruta coincide con este patrón.
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.
El
authorizeRequests().antMatchers()
se usa para aplicar la autorización a una o más rutas que especifique en
antMatchers()
.
Tales como
permitAll()
o
hasRole(''USER3'')
.
Estos solo se aplican si el primer
http.antMatcher()
coincide.
Necesita
antMatcher
para múltiples
HttpSecurity
, consulte
Spring Security Reference
:
5.7 Seguridad Http múltiple
Podemos configurar múltiples instancias HttpSecurity del mismo modo que podemos tener múltiples bloques
<http>. La clave es extender elWebSecurityConfigurationAdaptervarias 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 normal
2 Cree una instancia de
WebSecurityConfigurerAdapterque contenga@Orderpara especificar quéWebSecurityConfigurerAdapterdebe considerarse primero.3 El
http.antMatcherestablece que esteHttpSecuritysolo será aplicable a las URL que comienzan con/api/4 Cree otra instancia de
WebSecurityConfigurerAdapter. Si la URL no comienza con/api/, se usará esta configuración. Esta configuración se considera después deApiWebSecurityConfigurationAdapterya que tiene un valor de@Orderdespués de1(ningún@Orderpredeterminado de@Orderes el último).
En su caso, no necesita
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()