antMatcher() 与 antMatchers() 的 Spring 安全应用

Posted

技术标签:

【中文标题】antMatcher() 与 antMatchers() 的 Spring 安全应用【英文标题】:Spring security application of antMatcher() vs. antMatchers() 【发布时间】:2018-04-28 03:03:31 【问题描述】:

只是想看看我是否以正确的方式解释answer to this question。

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

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

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

【问题讨论】:

【参考方案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_”开头,因为它会自动插入。

【讨论】:

@Ole:不,您不进行全局安全设置,您始终为配置进行设置。您只需配置与 antMatcher() 一起使用的配置。 为了清楚起见,如果您不使用 Spring Boot,您的示例结果会发生变化,因为 Spring Boot 具有默认配置。为了使您的示例与 Spring Boot 一起使用,配置顺序必须正确。 因此,如果我们执行 http.antMatcher("/api/**") 以确保我得到它,那么 Spring 会为 "/api/**" 创建一个配置,然后我们继续为该配置应用特定的配置设置?如果我们说 http.antMatcher("v2/api/**") 那么 Spring 创建另一个适用于 API 版本 2 的安全配置? @Ole 在同一个 HttpSecurity 实例上调用 antMatcher() 两次只会替换原来的 antMatcher。要将相同的 HttpSecurity 配置应用于多个 antMatchers,请使用 http.requestMatchers()。 antMatchers()。另一种方法是创建多个 SecurityConfigurer,每个都使用自己的 antMatcher,然后用 \@order 注释它们以确保 spring 加载所有它们。 你好@dsep,我正在使用混合配置,我需要在我的 JwtSecurityConfig 中授权两个不同的路径。例如:/web/** 和 /mobile/**,我该怎么做? ***.com/questions/58231064/…【参考方案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());
    
   

【讨论】:

以上是关于antMatcher() 与 antMatchers() 的 Spring 安全应用的主要内容,如果未能解决你的问题,请参考以下文章

antMatcher 和 mvcMatcher 的区别

弹簧安全 AntMatcher 不工作

Spring security antMatcher 不起作用

Spring Security:antMatcher 的序列未按预期工作 [重复]

Spring security antMatcher 未按预期工作

允许通过Spring Web安全性限制访问安全资源