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_1
solo para USER y/high_level_url_A/sub_level_2
solo para USER2 -
Cualquier solicitud que coincida con
/high_level_url_B/**
debe autenticarse +/high_level_url_B/sub_level_1
para acceso público y/high_level_url_A/sub_level_2
solo 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 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 normal
2 Cree una instancia de
WebSecurityConfigurerAdapter
que contenga@Order
para especificar quéWebSecurityConfigurerAdapter
debe considerarse primero.3 El
http.antMatcher
establece que esteHttpSecurity
solo 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 deApiWebSecurityConfigurationAdapter
ya que tiene un valor de@Order
después de1
(ningún@Order
predeterminado de@Order
es 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()