antMatcher() vs. antMatchers() 的弹簧安全应用

只是想看看我是否以正确的方式解释这个问题的答案

如果我们只需要保护一条这样的路径:

http.antMatcher("/api/**").authorizeRequests()....

然后使用 .antMatcher()

如果我们需要保护多个 URL 路径,如下所示:

http
.authorizeRequests()
    .antMatchers("/high_level_url_A/sub_level_1").hasRole('USER')
    .antMatchers("/high_level_url_A/sub_level_2").hasRole('USER2')
    ...

然后使用 .antMatchers()

这个问题有两个答案,但每个答案中提供的示例与另一个给出的示例相矛盾。第一个答案说作者不需要,第二个答案说总是以“antMatcher()IIUC”开头。antMatcher()


答案 1

HttpSecurity.antMatcher()HttpSecurity 实例的默认请求匹配器更改为 AnyRequestMatcher 中的 AntPathRequestMatcher。ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry.antMatchers() 用于将授权规则应用于与当前 HttpSecurity 实例关联的端点子集。

示例代码:

http
    .antMatcher("/api/**")
    .httpBasic()
        .disable()
    .authorizeRequests()
        .antMatchers("/api/user/**", "/api/ticket/**", "/index")
            .hasRole("USER");

在上面的示例中,对匹配 /api/** 的所有终结点禁用了基本授权。此外,与 /api/user/**/api/ticket/** 匹配的终结点将要求请求的身份验证包含ROLE_USER。但是,当用户尝试访问 /index 时,将遇到基本的身份验证提示。输入凭据后,无论请求的身份验证是否包含ROLE_USER,都将向用户授予对终结点的访问权限。这是因为 .antMatcher(“/api/**”) 将整个 HttpSecurity 实例的范围限制为该特定 AntMatcher。

下面的示例将确保 HttpSecurity 的范围包括之前的三个 AntMatchers,而不是其他任何内容:

http
    .requestMatchers()
        .antMatchers("/api/user/**", "/api/ticket/**", "/index")
        .and()
    .httpBasic()
        .disable()
    .authorizeRequests()
        .any()
            .hasRole("USER");

编辑如果您使用#hasRole(),那么您的角色不应以“ROLE_”开头,因为这是自动插入的。


答案 2

antMatcher() 允许将 HttpSecurity 配置为仅在匹配提供的 ant 模式时调用。

如果需要更高级的配置,请考虑使用 requestMatchers() 或 requestMatcher(RequestMatcher)。

调用 antMatcher() 将覆盖 antMatcher()、mvcMatcher()requestMatchers()regexMatcher()requestMatcher() 的先前调用

请参阅下面有关使用 requestMatchers 的示例

   @Configuration
   @EnableWebSecurity
   public class RequestMatchersSecurityConfig extends WebSecurityConfigurerAdapter {
  
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .requestMatchers((requestMatchers) ->
                requestMatchers
                    .antMatchers("/api/**")
                    .antMatchers("/oauth/**")
            )
            .authorizeRequests((authorizeRequests) ->
                authorizeRequests
                    .antMatchers("/**").hasRole("USER")
            )
            .httpBasic(withDefaults());
    }
   }

下面的配置也与上面的配置相同。

   @Configuration
   @EnableWebSecurity
   public class RequestMatchersSecurityConfig extends WebSecurityConfigurerAdapter {
  
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .requestMatchers((requestMatchers) ->
                requestMatchers
                    .antMatchers("/api/**")
            )
            .requestMatchers((requestMatchers) ->
            requestMatchers
                .antMatchers("/oauth/**")
            )
            .authorizeRequests((authorizeRequests) ->
                authorizeRequests
                    .antMatchers("/**").hasRole("USER")
            )
            .httpBasic(withDefaults());
    }
   }

推荐