Spring Security: Multiple HTTP Config non funziona

Sto cercando di utilizzare Spring Security e ho un caso d’uso in cui voglio che vengano salvate diverse pagine di accesso e diversi set di URL.

Ecco la mia configurazione:

@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"); } } 

Queste classi sono classi interne di un’altra class MultipleHttpSecurityConfig con annotazione @EnableWebSecurity .

La sicurezza per admin/** funziona correttamente, ma nessuna delle pagine consumer/** è protetta, nessun reindirizzamento è in corso per la pagina di accesso. Ho cercato altre risposte ma nessuna ha funzionato.

Guarda il riferimento sulla sicurezza di 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 Configura l’autenticazione come di consueto

2 Creare un’istanza di WebSecurityConfigurerAdapter che contenga @Order per specificare quale WebSecurityConfigurerAdapter deve essere considerato per primo.

3 http.antMatcher afferma che questa HttpSecurity sarà applicabile solo agli URL che iniziano con /api/

4 Creare un’altra istanza di WebSecurityConfigurerAdapter . Se l’URL non inizia con /api/ verrà utilizzata questa configurazione. Questa configurazione viene considerata dopo ApiWebSecurityConfigurationAdapter poiché ha un valore @Order dopo 1 (nessun @Order predefinito di @Order ).

La tua seconda configurazione non viene utilizzata, perché la tua prima configurazione corrisponde a /** . E la tua prima configurazione limita solo /admin/** , tutti gli altri URL sono consentiti per impostazione predefinita.

Il tuo primo WebSecurityConfigurerAdapter

 http .authorizeRequests() 

corrisponde a tutti gli URL, limita solo agli URL che iniziano 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() ...