2017-04-25 84 views
0

我試圖在Spring安全性中推出自己的自定義ACL系統,該系統比默認的ACL系統更適合我的項目。我的問題是這樣的:Spring Security的ACL(訪問控制列表)如何處理每個OBJECT_IDENTITY具有多個權限的主體?

Spring Security提供的默認ACL實現如何處理每個域對象具有多個權限(OBJECT_IDENTITY)的單個主體對象(SID),而不會混淆數據庫?

文檔狀態:"ACL_ENTRY stores the individual permissions assigned to each recipient. Columns include a foreign key to the ACL_OBJECT_IDENTITY, the recipient (ie a foreign key to ACL_SID), whether we'll be auditing or not, and the integer bit mask that represents the actual permission being granted or denied. We have a single row for every recipient that receives a permission to work with a domain object."

所以ACL_ENTRY基本上是用戶具有權限的單個域對象的單個主體用戶之間的連接表,和。

好。然而;在控制器層上,可以在單個對象上執行多個CRUD方法。如果一個用戶有權更新和刪除一個對象,但是另一個用戶只有創建和讀取對象的權限(例如)。默認的Spring ACL系統是否在數據庫中存儲一個EACH和每個權限的主體用戶和域對象之間的權限?例如,Joe有權讀取此對象。行+ = 1. Joe也有權寫入此對象。行再次= 1,依此類推。

如果它能以這種方式實現我的自定義卷展欄,那麼因爲我擔心在數據庫中爲每個對象,每個主體添加多個權限(您可以看到如果一個主體讀取,寫入,並且更新每個對象的權限,即每個用戶三行,獲得300個用戶,這就是900行,你可以看到這是一個指數問題)。

如果不是那麼這是如何工作的?謝謝。

回答

0

是否默認的ACL春季系統存儲在數據庫中的一排 每一個主體用戶和域 對象之間的所有權限?

是的。

另一方面,權限只需要一位(開或關),並且Permission接口甚至有一個getMask()方法可將多個權限合併爲一個整數,因此每個sid /用戶和域對象。 但是,Spring Security中的內置ACL權限評估器可能會令人困惑地而不是處理這樣的位掩碼,但需要爲授予的每個權限分別設置一行。 編輯:這個限制在問題報告SEC-2342中有描述。

關於您對許多行存儲權限的擔心:安全標識(sid)不需要是單個用戶,它也可以是一個組。如果有許多用戶,請將用戶分配到組並設置組的權限。

+0

非常感謝你的這個信息。我想深入瞭解一些你的觀點。 1)如此真或假?:內置的評估程序無法處理這種內置的蒙版,並且需要爲每個許可單獨劃分一行。因此,在所有實際情況中,使用默認的ACL仍然需要爲每個單獨的權限創建一個新的單行,即在事件1上爲用戶1的讀取權限進行行操作。在事件1上爲用戶1寫入權限的新行等。? –

+1

@TylerDurden真(截至上次檢查)。 – holmis83

+0

和2)組在這裏與'角色'不同嗎?在我的自定義實現中,我正在考慮執行類似以下操作的操作:而不是讀取,寫入,更新等,我將擁有更像角色的自定義「權限」:dog_owner和vet_medic。我的連接表將一個域對象與一個主體用戶結合在一起,幷包含上述「權限」之一。這些'權限'本質上會帶有諸如更新,讀取,刪除等配額。現在,在控制器方法檢查中,@preAuthorization表達式將檢查dog_owner或vet_medic。 I.E.更新需要vet_medic –

相關問題