我正在学习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/hello 2”发送请求,我会收到401 Why if the rule that deny a request does not match with the antMatchers(“/rest 2/**”)?
3条答案
按热度按时间j8yoct9x1#
requestMatchers()
的目的是指定Spring安全配置将应用于哪些请求。例如,如果您有2个端点
"/public"
和"/private"
,并且您只希望将安全性(特别是csrf保护)应用于"/private"
,则可以添加以下配置:然后,如果你POST到
"/private"
,你会得到一个403响应。但是如果你POST到
"/public"
,你会得到200,因为没有应用安全性。这与
authorizeRequests
不同,authorizeRequests
指示该端点所需的访问类型,而不是是否应用安全性。在你提到的例子1中
安全配置仅应用于
"/management/**"
,因此如果您向"/foo"
发出请求,它将不安全。在你提到的例子2中,
"/rest/v1/test/hello2"
响应401的原因是因为"/rest/**"
在请求匹配器中,因此您的安全规则.antMatchers("/rest/v1/test/hello").permitAll()
将适用。如果您向
"/rest3/v1/test/hello2"
发出请求,那么它将以200响应,因为"/rest3/**"
不属于任何请求匹配器。jk9hmnmh2#
Sping Boot 3更新
WebSecurityConfigurerAdapter
已被删除,Spring Security 5.5引入了一种使用SecurityFilterChain
接口配置安全性的新方法-HttpSecurity构建器API已被弃用。例如,为了允许在
/public/
上的请求和其他所有内容,同时保留ant-pattern注解,用途:“Authenticated users”的定义可以使用
JwtTokenFilter
扩展OncePerRequestFilter
来指定(例如)。nmpmafwu3#
Spring安全API:public final类HttpSecurity.RequestMatcherConfigurer扩展了AbstractRequestMatcherRegistry
允许Map此HttpSecurity将用于的HTTP请求