75

我们什么时候使用antMatcher()vs antMatchers()

例如:

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/high_level_url_A/sub_level_2
  • 任何与/high_level_url_B/**_ _/high_level_url_B/sub_level_1/high_level_url_A/sub_level_2
  • 我不在乎的任何其他模式 - 但应该公开吗?

我看到的最新例子不包括antMatcher()这些天。这是为什么?antMatcher()不再需要?

4

3 回答 3

91

您需要antMatcher多个HttpSecurity,请参阅Spring Security Reference

5.7 多重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应首先考虑的实例。

3http.antMatcher声明这HttpSecurity仅适用于以/api/

4 创建另一个实例WebSecurityConfigurerAdapter。如果 URL 不以此配置开头,/api/则将使用此配置。这个配置被认为是 afterApiWebSecurityConfigurationAdapter因为它有一个@Order值 after 1(没有@Order默认为 last)。

在您的情况下,您不需要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()
于 2017-01-07T23:08:54.120 回答
56

我正在更新我的答案...

antMatcher()是 的一种方法HttpSecurity,与 没有任何关系authorizeRequests()。基本上,http.antMatcher()告诉 Spring 仅HttpSecurity在路径与此模式匹配时进行配置。

然后authorizeRequests().antMatchers()用于将授权应用于您在 中指定的一个或多个路径antMatchers()。比如permitAll()hasRole('USER3')。这些只有在第一个http.antMatcher()匹配时才会应用。

于 2016-03-09T12:42:07.033 回答
8

基本上http.antMatcher()告诉 Spring 仅HttpSecurity在路径与此模式匹配时进行配置。

于 2019-03-31T06:49:34.063 回答