了解 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