Spring资源上的安全性仅适用于' @ PreAuthorize'

时间:2017-06-20 15:37:59

标签: spring spring-boot spring-security spring-security-oauth2

我不知道自己做错了什么,但当我尝试使用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

它正在发挥作用,但是,我担心它可以以更好的方式完成。有什么想法吗?

1 个答案:

答案 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注释。