什么时候使用antMatcher()vs antMatchers()?
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/**
/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
我看到最近的例子不包括antMatcher()这些天。这是为什么?是否antMatcher()不再需要?
您需要antMatcher多个HttpSecurity,请参阅SpringSecurity Reference:
antMatcher
HttpSecurity
5.7多个HttpSecurity
我们可以配置多个HttpSecurity实例,就像我们可以拥有多个<http>块一样。关键是要WebSecurityConfigurationAdapter多次扩展。例如,以下是对以开头的URL具有不同配置的示例/api/。
<http>
WebSecurityConfigurationAdapter
/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应首先考虑的对象。
WebSecurityConfigurerAdapter
@Order
3 http.antMatcher指出这HttpSecurity仅适用于以开头的URL/api/
http.antMatcher
4创建的另一个实例WebSecurityConfigurerAdapter。如果URL不以/api/该配置开头,则将使用此配置。以后考虑此配置,ApiWebSecurityConfigurationAdapter因为它的@Order值是after 1(没有@Order默认值是last)。
ApiWebSecurityConfigurationAdapter
1
在您的情况下,您不需要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()