java - authenticationentrypoint - spring security 5 xml configuration
Spring Security: la configuración HTTP múltiple no funciona (2)
Mira la referencia de seguridad de Spring :
@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).
Su segunda configuración no se utiliza, porque su primera configuración coincide con
/**
(sin
antMatcher
configurado).
Y su primera configuración solo restringe
/admin/**
, todas las demás URL están permitidas de manera predeterminada.
Estoy tratando de usar Spring Security y tengo un caso de uso en el que quiero que se aseguren diferentes páginas de inicio de sesión y diferentes conjuntos de URL.
Aquí está mi configuración:
@Configuration
@Order(1)
public static class ProviderSecurity extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.antMatchers("/admin/login").permitAll()
.antMatchers("/admin/**").access("hasRole(''BASE_USER'')")
.and()
.formLogin()
.loginPage("/admin/login").permitAll()
.defaultSuccessUrl("/admin/home")
.failureUrl("/admin/login?error=true").permitAll()
.usernameParameter("username")
.passwordParameter("password")
.and()
.csrf()
.and()
.exceptionHandling().accessDeniedPage("/Access_Denied");
}
}
@Configuration
@Order(2)
public static class ConsumerSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/consumer/login").permitAll()
.antMatchers("/consumer/**").access("hasRole(''BASE_USER'')")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/consumer/login").permitAll()
.defaultSuccessUrl("/consumer/home")
.failureUrl("/consumer/login?error=true").permitAll()
.usernameParameter("username")
.passwordParameter("password")
.and().csrf()
.and()
.exceptionHandling().accessDeniedPage("/Access_Denied");
}
}
Estas clases son clases internas de otra clase
MultipleHttpSecurityConfig
que tiene la anotación
@EnableWebSecurity
.
La seguridad para
admin/**
está funcionando bien, pero ninguna de las páginas de
consumer/**
está protegida, no se está realizando una redirección para la página de inicio de sesión.
He buscado otras respuestas pero ninguna funcionó.
Su primer
WebSecurityConfigurerAdapter
''s
http
.authorizeRequests()
coincide con todas las URL, limítelo a solo las URL que comiencen con
/admin
usando
antMatcher
:
@Configuration
@Order(1)
public static class ProviderSecurity extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/admin/**")
.authorizeRequests()
.antMatchers("/admin/login").permitAll()
.antMatchers("/admin/**").access("hasRole(''BASE_USER'')")
.and()
...