2017-03-03 103 views
1

如果我有一個存儲在表中並通過url/orders/{id}公開的訂單列表,並且我想通過更改url中的路徑id來限制主體訪問訂單,Spring Security如何幫助我查詢Spring Data JPA存儲庫。Spring安全授權存儲庫查詢

基於Spring Security的4個YouTube視頻: -

interface OrderRepository extends Repository<Order, Long> { 

    @Query("select o from Order o where o.id = ?1 and o.from.id = ?{#principal.id} ") 
    Optional<Order> findOrder(long id); 
} 

這是最好的做法呢?理想情況下,我想使用Spring Data方法名稱功能,並避免在這種情況下重寫Query。

回答

0

我想你要找的是Spring安全中的@PreAuthorize或@PostAuthorize。它們是春季方法級別安全性的註釋。他們將允許您根據角色和其他屬性進行限制。

interface OrderRepository extends Repository<Order, Long> { 

@PreAuthorize("hasRole('ROLE_ADMIN')") // Allows only users with admin privileges 
@Query("select o from Order o where o.id = ?1 and o.from.id = ?{#principal.id} ") 
Optional<Order> findOrder(long id); 

}

https://spring.io/blog/2013/07/04/spring-security-java-config-preview-method-security/


編輯:

如果你看如果當前認證的用戶與誰的順序與關聯只返回訂單。

@PostAuthorize("returnObject.from == authentication.name") 
Optional<Order> findOrder(long id); 

您可以使用彈簧表達式語言和@PreAuthorize @PostAuthorize批註。

http://docs.spring.io/spring-security/site/docs/current/reference/html/el-access.html

希望這有助於


編輯2:您可以使用@PreFilter和@PostFilter篩選集合。

@PostFilter("filterObject.from == authentication.name") 
List<Order> findOrder(long id); 

這將在列表中運行,只返回訂單從哪裏是當前認證的用戶。你也可以組合表達式。

@PostFilter("hasRole('ROLE_ADMIN') or filterObject.from == authentication.name") 
List<Order> findOrder(long id); 

這將檢查當前已通過身份驗證的用戶是否具有角色ROLE_ADMIN。如果用戶具有該特權,未改變的列表將會返回,否則它將過濾並且僅返回那些「from」與當前經過驗證的用戶相關聯的訂單。

+0

@PreAuthorize如何在每個用戶的基礎上進行授權,而不是根據角色進行授權? – aprofromindia

+0

@aprofromindia編輯了我的帖子。 PostAuthorize將使用當前經過身份驗證的用戶檢查返回的Order對象的from成員變量。 – jmw5598

+0

酷我們怎樣才能實現findAll()授權這個邏輯請。我不想使用@PostFilter()並過濾整個列表。 – aprofromindia