什么时候使用 Spring Security 的 antMatcher() ?

我们什么时候使用 antMatcher()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/**匹配的请求都应该只对 USER 进行认证 + /high_level_url_A/sub_level_1,对 USER2进行 /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只用于 USER3。
  • 其他我不在乎的模式,但应该公开吗?

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

203389 次浏览

我在更新我的答案。

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

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

多个 HttpSecurity需要 antMatcher,参见 Spring 安全引用:

5.7多重 HttpSecurity

我们可以配置多个 HttpSecurity 实例,就像我们可以配置多个 <http>块一样。关键是多次扩展 WebSecurityConfigurationAdapter。例如,下面的例子说明了如何为以 /api/开头的 URL 进行不同的配置。

@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创建一个包含 @OrderWebSecurityConfigurerAdapter实例,指定应该首先考虑哪个 WebSecurityConfigurerAdapter

3 http.antMatcher声明这个 HttpSecurity将只适用于以 /api/开头的 URL

4创建 WebSecurityConfigurerAdapter的另一个实例。如果 URL 没有以 /api/开头,那么将使用这个配置。这个配置在 ApiWebSecurityConfigurationAdapter之后考虑,因为它在 1之后有一个 @Order值(没有 @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()