我想你要找的是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」與當前經過驗證的用戶相關聯的訂單。
@PreAuthorize如何在每個用戶的基礎上進行授權,而不是根據角色進行授權? – aprofromindia
@aprofromindia編輯了我的帖子。 PostAuthorize將使用當前經過身份驗證的用戶檢查返回的Order對象的from成員變量。 – jmw5598
酷我們怎樣才能實現findAll()授權這個邏輯請。我不想使用@PostFilter()並過濾整個列表。 – aprofromindia