2016-04-25 41 views
2

我們使用Spring Security的ACL註釋來允許訪問某些Web服務。 @PreAuthorize@PostAuthorize似乎是非常有用的,並支持我們正在使用的大多數用例。基於SPEL的個體方法等規則正在幫助我們在應用和服務方面實現良好的糧食安全。如何使用Spring Security @Pre和@Post註解集合

對於如: - 我們檢查返回對象的所有者,如下

@PreAuthorize("hasRole('ROLE_ADMIN') and returnObject.owner == authentication.name") 
public SomeDTO getSomeDTO(){ ... } 

時,返回一個對象也能正常工作。如果返回一個List,那會是什麼?我們如何循環採集並使用SPEL檢查該集合中的單個元素屬性?

回答

0

請嘗試以下表達式並參閱。

@PreAuthorize("hasRole('ROLE_ADMIN') and returnObject.?[owner == authentication.name].size() == returnObject.size()") 
public List<SomeDTO> getSomeDTOs(){ ... } 

看到這個post

+0

這似乎不起作用,但文檔似乎是合法的。讓我嘗試更多的例子並看看 – aksappy

1

如果是集合,您應該使用@PreFilter@PostFilter註釋。

當使用@PostFilter註釋,春季安全迭代 通過返回的集合,並刪除的量, 提供的表達式爲假的任何元件。名稱filterObject引用該集合中的當前對象 。您還可以在 方法調用之前使用@PreFilter進行過濾,雖然這是不太常見的 要求。

查看下面的例子或找到更多的細節here

@PreAuthorize("hasRole('ROLE_ADMIN')") 
@PostFilter("filterObject.owner == authentication.name") 
public List<SomeDTO> getAll(); 
0

這取決於您的需求。

如果您打算從結果中篩選出不允許的對象,則可以使用@PostFilter批註來篩選出不匹配的元素。 例如(filterObject從響應綁定到一個列表元素):

@PostFilter("filterObject.owner == authentication.name") 
public List<SomeDTO> getAll(){ ... } 

如果你只有當所有元素都被允許意圖返回結果,@PostFilter不會幫助你,你可以嘗試在@PostAuthorize註釋中使用SPEL的hasPermission函數。有Permission可以獲得任何類型的對象,並使用您的自定義實現(您需要編寫)進行邏輯檢查。 爲例,您可以參考this example (section 4)