我不知道自己做错了什么,但当我尝试使用ResourceServerConfigurerAdapter
来保护某些REST资源时,它并不起作用。我只能使用@PreAuthorize
完成目标或在WebSecurityConfigurerAdapter
上设置安全性。
实际上,WebSecurityConfigurerAdapter
正在窃取HttpSecurity
设置的所有可能性。我相信它与过滤顺序有关。我搜索了有关文档的信息,但发现它很模糊。我知道在 Spring Boot版本1.5+上,ResourceServerConfigurerAdapter
的过滤顺序已经更改,我只是设法在属性上设置新订单后才能使其工作:{{ 1}}
更具体地说,此代码(在security.oauth2.resource.filter-order=3
上)没有任何结果:
ResourceServerConfigurerAdapter
只能在控制器方法上保护@Override
public void configure(HttpSecurity http) throws Exception {
http.requestMatcher(new OAuthRequestedMatcher())
.anonymous().disable()
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS).permitAll()
.antMatchers("/api/hello").access("hasAnyRole('USER')")
.antMatchers("/api/me").hasAnyRole("USER", "ADMIN");
}
和"/api/hello"
注释"/api/me"
:
@PreAuthorize
它正在发挥作用,但是,我担心它可以以更好的方式完成。有什么想法吗?
答案 0 :(得分:1)
经过一番挖掘后,我找到了解决方案。问题确实与过滤顺序有关。 Pivotal的工作人员改变了 Oauth2资源过滤器订单,正如您在 Spring Boot 1.5发行说明中所看到的这段文字中所见:
OAuth 2资源过滤器
OAuth2资源过滤器的默认顺序已从3更改为 SecurityProperties.ACCESS_OVERRIDE_ORDER - 1.这将它置于之后 执行器端点但在基本认证过滤器链之前。 可以通过设置恢复默认值 security.oauth2.resource.filter-order = 3
但是,正如@ilovkatie对此thread所指出的那样,WebSecurityConfigurerAdapter
的顺序也更改为100,优先于ResourceServerConfigurerAdapter
。
因此,而不是更改ResourceServerConfigurerAdapter
对属性的顺序,更优雅的解决方案是在@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
上使用WebSecurityConfigurerAdapter
。
这将使资源配置优先于WebSecurityConfigurerAdapter
,并且可以使用HttpSecurity
上的ResourceServerConfigurerAdapter
设置安全性,从而无需使用@PreAuthorize
注释。