2016-03-09 4 views
9

Когда мы используем antMatcher() против antMatchers()?Когда использовать antMatcher Spring Security()?

Например:

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

Что я ожидаю здесь есть,

  • Любой запрос соответствует к /high_level_url_A/** должны быть заверены + /high_level_url_A/sub_level_1 только для USER и /high_level_url_A/sub_level_2 только для ПОЛЬЗ.2
  • Любой запрос спичек до /high_level_url_B/** должны быть аутентифицированы + /high_level_url_B/sub_level_1 для общего доступа и /high_level_url_A/sub_level_2 только для USER3.
  • Любые другие шаблоны Мне все равно - Но должны быть общедоступными?

Я видел последние примеры, которые не включают в себя antMatcher() в эти дни. Почему это? antMatcher() больше не требуется?

ответ

14

Вам нужно antMatcher для нескольких HttpSecurity см Spring Security Reference:

5,7 Multiple HttpSecurity

Мы можем настроить несколько экземпляров HttpSecurity так же, как мы можем иметь несколько <http> блоков. Ключ состоит в том, чтобы развернуть WebSecurityConfigurationAdapter несколько раз. Например, ниже приведен пример конфигурации URL-адреса, начинающейся с /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 Настройка аутентификации в обычном режиме

2 Создание экземпляра WebSecurityConfigurerAdapter, который содержит @Order, чтобы указать, какие WebSecurityConfigurerAdapter следует рассматривать в первую очередь.

3 В http.antMatcher говорится, что это HttpSecurity будет применимо только к URL-адресам, которые начинаются с /api/

4 Создайте еще один экземпляр WebSecurityConfigurerAdapter. Если URL-адрес не начинается с /api/, эта конфигурация будет использоваться. Эта конфигурация рассматривается после ApiWebSecurityConfigurationAdapter, так как она имеет значение @Order после 1 (нет @Order по умолчанию).

В вашем случае вам не нужно antMatcher, потому что у вас есть только одна конфигурация. Ваш модифицированный код:

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

Я обновляю свой ответ ...

antMatcher() является методом HttpSecurity, он не имеет ничего общего с authorizeRequests(). В принципе, http.antMatcher() сообщает Spring только настроить HttpSecurity, если путь соответствует этому шаблону.

authorizeRequests().antMatchers() затем используется для применения авторизации к одному или нескольким путям, указанным в antMatchers(). Например, permitAll() или hasRole('USER3'). Они применяются только при первом сопоставлении первого http.antMatcher().

Смежные вопросы