1

我不知道我在做什麼錯,但是當我嘗試使用ResourceServerConfigurerAdapter來保護某些REST資源時,它不起作用。我只能使用@PreAuthorize或在WebSecurityConfigurerAdapter上設置安全性來實現我的目標。Spring資源上的安全性僅適用於'@PreAuthorize'

實際上,WebSecurityConfigurerAdapter正在竊取HttpSecurity設置的所有可能性。我相信這與篩選順序有關。我搜索了關於文檔的信息,但發現它很模糊。我知道,在春天引導版本1.5+的ResourceServerConfigurerAdapter濾波順序已經改變了,我只設法得到它的屬性設置一個新的訂單後,開始工作: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

@PreAuthorize("hasAnyRole('USER','ADMIN')") 
@GetMapping("/api/hello") 
public ResponseEntity<?> hello() { 
    String name = SecurityContextHolder.getContext().getAuthentication().getName(); 
    String msg = String.format("Hello %s", name); 
    return new ResponseEntity<Object>(msg, HttpStatus.OK); 
} 

它正在工作,但是,我擔心它可以以更好的方式完成。有任何想法嗎?

回答

1

經過一番挖掘,我找到了解決方案。問題確實與過濾順序有關。在樞紐的傢伙改變了的oauth2資源濾波器階,你可以在這個通道從春季啓動1.5版本說明採取看到:

的OAuth 2資源篩選

的OAuth2用戶的默認順序資源過濾器已從3更改爲 SecurityProperties.ACCESS_OVERRIDE_ORDER - 1.這將它放在執行器端點 之後但位於基本身份驗證篩選器鏈之前。 默認可以通過設置 security.oauth2.resource.filter階= 3

但是被恢復,因爲在此thread指出由@ilovkatie,所述WebSecurityConfigurerAdapter的次序也被改變到100,採取優先超過ResourceServerConfigurerAdapter

所以,,而不是在性質改變ResourceServerConfigurerAdapter的訂單,更優雅的解決辦法是對WebSecurityConfigurerAdapter使用@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)

這將使資源配置優先於WebSecurityConfigurerAdapter,這將是可以設置使用HttpSecurity安全的ResourceServerConfigurerAdapter,從而不必使用@PreAuthorize註解。

相關問題