2015-11-09 22 views
6

Sto provando a utilizzare Spring Security e ho un caso d'uso in cui voglio che siano salvate diverse pagine di login e diversi set di URL.Spring Security: Multiple HTTP Config non funziona

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 le classi interne di un'altra classe MultipleHttpSecurityConfig che ha l'annotazione @EnableWebSecurity.

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

risposta

8

sguardo al Spring Security Reference:

@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 Configurare l'autenticazione come normale

2 crea un'istanza di WebSecurityConfigurerAdapter che contiene @Order per specificare quali WebSecurityConfigurerAdapter dovrebbero essere considerati prima.

3 I http.antMatcher afferma che questo 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 il ApiWebSecurityConfigurationAdapter poiché ha un valore @Order dopo 1 (non esiste il valore predefinito @Order).

La seconda configurazione non viene utilizzata, perché la prima configurazione corrisponde a /**. E la tua prima configurazione limita solo a /admin/**.

8

I suoi primi l'

http 
      .authorizeRequests() 

WebSecurityConfigurerAdapter partite tutti gli URL, limitare al solo gli URL iniziano con /admin utilizzando 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() 

       ... 
Problemi correlati