2016-07-22 125 views
0

我有很多API端點需要經過身份驗證的請求,還有一些允許任何請求的API端點。我想Spring Security的缺省阻止匿名請求,但讓我改寫它:即使使用@PreAuthorize(「permitAll()」),Spring Security也會阻止匿名請求。

aHttpSecurity.authorizeRequests().anyRequest().authenticated() 

... 

@PreAuthorize("permitAll()") 
@RequestMapping("/foobar") 
public ResponseEntity<FooBar> get() { 
    ... 
} 

不幸的是,這並不工作:/foobar輸出401任何想法,該怎麼辦?

+1

'aHttpSecurity.authorizeRequests()。anyRequest()。authenticated()'這將阻止請求之前,它到達註釋的方法! –

+0

@AliDehghani是的,這也是我注意到的問題,問題是:如何改變這種行爲,使得@PreAuthorize具有更高的優先級? – sp00m

回答

0

春季安全有保障的兩個層次。

過濾級別和方法級別。

過濾級別可以和URL一起工作,如果一個URL沒有被配置爲被訪問,它將被相應的401或403拒絕訪問。這是由FilterSecurityInterceptor

方法級別經常用作第二級防禦授權誰可以訪問一個方法以及他/她可以操作哪些操作或對象。這是由MethodSecurityInterceptor

1

@PreAuthorize只是一個包裝方法來檢查用戶是否可以執行帶註釋的方法的註釋。它不僅適用於控制器。

當你有http請求時,首先請求通過一些spring安全過濾器,當你編寫.anyRequest().authenticated()時,你只是不會去一些被包裝的控制器端點。

所以,如果你有幾個端點可以exlude它

和刪除@PreAuthorize("permitAll()")

相關問題