了解 spring-security 上的 requestMatchers()

Posted

技术标签:

【中文标题】了解 spring-security 上的 requestMatchers()【英文标题】:Understanding requestMatchers() on spring-security 【发布时间】:2019-02-01 09:33:44 【问题描述】:

我正在研究一些 spring-security 的代码。我想了解我在互联网上找到的这个例子 1

http.requestMatchers()
        .antMatchers("/management/**") // (1)
        .and()
        .authorizeRequests() // (2)
        .antMatchers("/management/health")
        .permitAll()
        .antMatchers("/management/info")
        .permitAll()
        .antMatchers("/management/**")
        .hasRole("ACTUATOR")
        .anyRequest().permitAll()
        .and()
        .httpBasic(); (3)

看不懂这个配置,为什么是这个代码:

http.requestMatchers()
        .antMatchers("/management/**")
        .and() 

在 .authorizeRequests() 之前? (1)

这是什么意思?

你能解释一下这个例子吗?

2:第二种情况,有什么区别?

http.requestMatchers().antMatchers("/rest2/**")
.and()
.authorizeRequests()
.antMatchers("/rest/v1/test/hello").permitAll()
.antMatchers("/rest/v1/test/**").denyAll()
.and()
.requestMatchers().antMatchers("/rest/**")
.and()
.authorizeRequests()
.antMatchers("/rest/v1/test/hello").permitAll();

使用 requestMatchers() 有什么影响?

如果我向“/rest/v1/test/hello2”发送请求,我收到 401 为什么如果拒绝请求的规则与 antMatchers("/rest2/**") 不匹配?

【问题讨论】:

不要在一个问题中问两个不同的问题。您应该打开两个单独的问题,因为它们不相关。 但是,你第一个问题的答案是你对默认值的理解是错误的。在这种情况下,默认意味着没有自定义 Spring Security 配置,但您有自定义 Sprig Security 配置。 您的第二个问题很可能是重复的。例如:***.com/questions/35890540/…(大约是antMatcher,但requestMatchers的解释是一样的。 @dur,我将我的问题分为两个问题,请参阅***.com/questions/52039148/…。我仍然怀疑为什么在其他配置之前使用 requestMatchers(),我在示例中几乎只看到了 authorizeRequests()。 【参考方案1】:

requestMatchers() 的目的是指定 spring 安全配置将应用于哪些请求。

例如,如果您有 2 个端点 "/public""/private",并且您只想将安全性(特别是 csrf 保护)应用于 "/private",那么您可以添加以下配置:

http
    .requestMatchers()
        .antMatchers("/private/**")
        .and()
    .csrf();

然后,如果您 POST 到 "/private",您将收到 403 响应。 但是,如果您 POST 到 "/public",您将得到 200,因为没有应用任何安全措施。

这与authorizeRequests 不同,authorizeRequests 表示该端点所需的访问类型,而不是是否应用了安全性。

在您提到的示例 1 中

http
    .requestMatchers()
        .antMatchers("/management/**")
        .and() 
        ...

安全配置只适用于"/management/**",所以如果你向"/foo"发出请求,它不会被保护。

在你提到的例子2中,

http
    .requestMatchers()
        .antMatchers("/rest2/**")
        .and()
    .authorizeRequests()
        .antMatchers("/rest/v1/test/hello").permitAll()
        .antMatchers("/rest/v1/test/**").denyAll()
        .and()
    .requestMatchers()
        .antMatchers("/rest/**")
        .and()
    .authorizeRequests()
        .antMatchers("/rest/v1/test/hello").permitAll();

"/rest/v1/test/hello2" 以 401 响应的原因是因为 "/rest/**" 在请求匹配器中,因此您的安全规则 .antMatchers("/rest/v1/test/hello").permitAll() 将适用。 如果您要向 "/rest3/v1/test/hello2" 发出请求,那么它会以 200 响应,因为 "/rest3/**" 不是任何请求匹配器的一部分。

【讨论】:

【参考方案2】:

Spring 安全 API: 公共最终类 HttpSecurity.RequestMatcherConfigurer 扩展 AbstractRequestMatcherRegistry

允许映射此 HttpSecurity 将用于的 HTTP 请求

【讨论】:

以上是关于了解 spring-security 上的 requestMatchers()的主要内容,如果未能解决你的问题,请参考以下文章

Spring-security、Tomcat 和 SPNEGO - 最佳方法

Spring-Security:AuthenticationManager 抛出 BadCredentialsException 时返回状态 401

如何使用 Spring-Security 3 和 Hibernate 4 将 spring security xml 配置 hibernate 转换为 java config

Req.Body 是 Angular 2 表单提交 + Bodyparser 上的空对象

网关性能测试---初步了解

NodeJS 和 mysql (POST req) 上的 jQuery AJAX 调用,用于依赖下拉列表