2016-07-29 73 views
2

我的應用程序中有一些複雜的訪問限制,基本上需要查看用戶角色的組合以及域對象的一些深層屬性,以制定訪問決策。我如何獲得@PostAuthorize失敗導致@Transactional回滾?

對於我的一些方法(特別是像getItem(Integer id)updateItem(Integer id, FormBean form)),我不能提前知道他們是否被允許訪問該項目,因爲我還沒有它,所以我一直使用@PostAuthorize。

但是,後面的示例updateItem(id, form)提出了一個挑戰。我只想讓他們在某些特定情況下更新表格。現在,我確實看到@PostAuthorize使他們在執行他們不應該做的事情時得到HTTP 403響應,但數據庫更改不會回滾。

是否有可能獲得@PreAuthorize@Transactional@PostAuthorize在這種情況下都可以很好地一起玩? (我想也許可以通過調整他們的一些建議的順序......但我不完全清楚應該怎麼做)。

或者,我的系統變得足夠複雜,我應該真的咬住域ACL的項目符號?不幸的是,這些文件感覺相當薄...

回答

0

爲什麼不使用@PreAuthorize("hasPermission(#id, 'read')")@PreAuthorize("hasPermission(#id, 'update')")implement your own version of PermissionEvaluator

但是,如果你確實希望使用@PostAuthorize那麼你可以嘗試擺弄安全和交易方面的排序,as is described here

+0

謝謝,我同意這可能是要走的路。不幸的是,當我開始用它來管理多個域類時,那個界面感覺像會導致一些混亂的代碼。你有任何建議的模式來處理? (我想我想註冊一個類來處理每個領域類的hasPermission;每個領域都需要'@ Autowire'一個'FooRepository'類,什麼不是) – pioto

+0

你可以有一個泛型基類類型參數將是實體類型,並且您還將擁有一個存儲庫字段讓您可以讓Spring爲您自動裝載。基類將有一個抽象方法,它將返回給定ID和身份驗證的一組特權,然後子類將實現該方法。基類將獲取該集合並檢查它是否包含所需的特權。 –