带有 RequestHeaderMatcher 的 Spring Boot Security PermitAll 不起作用
Posted
技术标签:
【中文标题】带有 RequestHeaderMatcher 的 Spring Boot Security PermitAll 不起作用【英文标题】:Spring Boot Security PermitAll with RequestHeaderMatcher not working 【发布时间】:2020-10-02 09:12:26 【问题描述】:在学习了关于 Maven Spring Boot 中的微服务和 OAuth2 的教程之后,我遇到了一个问题。我想从身份验证中排除请求,因此可以获得未经授权的数据。这只似乎不适用于我这样做的方式。有人可以帮我解决这个问题吗?
我遵循的教程:https://developer.okta.com/blog/2018/02/13/secure-spring-microservices-with-oauth#microservices-architectures-with-spring-boot--spring-cloud
我尝试了什么:
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter
@Override
public void configure(HttpSecurity http) throws Exception
http.requestMatcher(new RequestHeaderRequestMatcher("Authorization"))
.authorizeRequests()
.antMatchers("/**").authenticated()
.and()
.authorizeRequests()
.andMatchers(HttpMethod.GET, "/beers").permitAll();
当我尝试执行请求时,我必须进行身份验证。我该如何解决?
spring-security-oauth2-autoconfigure: 2.1.1.RELEASE
【问题讨论】:
【参考方案1】:首先,您的配置与以下相同。只需删除那些不必要的重复 authorizeRequests()
和 and()
,使其看起来更清晰:
http.requestMatcher(new RequestHeaderRequestMatcher("Authorization"))
.authorizeRequests()
.antMatchers("/**").authenticated()
.andMatchers(HttpMethod.GET, "/beers").permitAll();
这意味着 Spring Security 只会处理具有 Authorization
标头的请求。否则,该请求将被忽略,并且不会应用任何 Spring Security 内容。
所以如果请求有Authorization
头,那么它就会开始按照声明的顺序从上到下检查规则(即authorizeRequests()
配置的那些匹配器的东西)。一旦匹配了一个规则,底部规则将被忽略,不会被检查。
由于您的第一条规则是匹配每个 HTTP 请求(“/**”),这使得它下面的所有规则永远不会执行并且没有任何意义。
另一方面,如果你希望 spring security 完全忽略“/beers”,即使它的请求有Authorization
标头,你应该配置WebSecurity
忽略它:
public void configure(WebSecurity web) throws Exception
web.ignoring()
.antMatchers(HttpMethod.GET, "/beers");
【讨论】:
以上是关于带有 RequestHeaderMatcher 的 Spring Boot Security PermitAll 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 uuencode 的“sendmail”发送邮件,并带有主题
带有 RecyclerView 的 DialogFragment 比带有 Recyclerview 的 Fragment 慢