variable tutorial protect pattern httpsecurity español ejemplo authorizerequests antmatchers anotaciones and spring-mvc spring-security spring-security4

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 el WebSecurityConfigurationAdapter 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 este HttpSecurity 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 de ApiWebSecurityConfigurationAdapter ya que tiene un valor de @Order después de 1 (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()