Spring Security: la configuración HTTP múltiple no funciona

Estoy intentando usar Spring Security y tengo un caso de uso en el que deseo que se aseguren diferentes páginas de inicio de sesión y un conjunto diferente 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 de admin/** está funcionando bien, pero ninguna de las páginas de consumer/** está protegida, no se está redireccionando la página de inicio de sesión. He buscado otras respuestas pero ninguna funcionó.

Mire 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 de forma normal

2 Cree una instancia de WebSecurityConfigurerAdapter que contenga @Order para especificar qué WebSecurityConfigurerAdapter debe considerar primero.

3 El http.antMatcher declara que esta HttpSecurity solo será aplicable a las URL que comiencen con /api/

4 Cree otra instancia de WebSecurityConfigurerAdapter . Si la URL no comienza con /api/ esta configuración será utilizada. 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).

Su segunda configuración no se usa porque su primera configuración coincide con /** . Y su primera configuración restringe solo /admin/** , todas las demás URL están permitidas por defecto.

Su primer WebSecurityConfigurerAdapter

 http .authorizeRequests() 

coincide con todas las URL, antMatcher a solo las URL que comienzan 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() ...