2016-03-09 8 views
9

Quando si utilizza antMatcher() rispetto a antMatchers()?Quando usare antMatcher() di Spring Security?

Ad esempio:

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() 
    ... 

Quello che mi aspetto è qui,

  • Ogni domanda corrisponde al /high_level_url_A/** deve essere autenticata + /high_level_url_A/sub_level_1 solo per USER e /high_level_url_A/sub_level_2 solo per UTENTE2
  • qualsiasi richiesta partite a /high_level_url_B/** deve essere autenticato + /high_level_url_B/sub_level_1 per l'accesso pubblico e /high_level_url_A/sub_level_2 solo per USER3.
  • Qualsiasi altro schema non mi interessa, ma dovrebbe essere pubblico?

Ho visto che gli ultimi esempi non includono antMatcher() in questi giorni. Perché? antMatcher() non è più necessario?

risposta

14

È necessario antMatcher per più HttpSecurity, vedi Spring Security Reference:

5,7 multipla HttpSecurity

Siamo in grado di configurare più istanze HttpSecurity così come possiamo avere più <http> blocchi. La chiave è di estendere lo WebSecurityConfigurationAdapter più volte. Ad esempio, il seguente è un esempio di una configurazione diversa per gli URL che iniziano 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 Configurazione dell'autenticazione normalmente

2 Creare un'istanza di WebSecurityConfigurerAdapter contenente @Order secondo cui 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).

Nel tuo caso non è necessario antMatcher, perché si dispone di una sola configurazione. Il tuo codice modificato:

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() 
9

sto aggiornando la mia risposta ...

antMatcher() è un metodo di HttpSecurity, non ha nulla a che fare con authorizeRequests(). Fondamentalmente, http.antMatcher() indica a Spring di configurare solo HttpSecurity se il percorso corrisponde a questo modello.

Il authorizeRequests().antMatchers() viene quindi utilizzato per applicare l'autorizzazione a uno o più percorsi specificati in antMatchers(). Ad esempio permitAll() o hasRole('USER3'). Questi vengono applicati solo se il primo http.antMatcher() corrisponde.