2014-01-27 111 views
0

我正在使用Spring Security ACL。當我保存一個對象時,我還創建了一個新的ACE(訪問控制條目)。我用這個方法:在Spring Security中授予權限Acl

acl.insertAce(acl.getEntries().size(), BasePermission.CREATE, recipient, true); 

我想知道如果我這樣做是正確的時候我調用此方法一個時刻爲貨主(即增加它的身份驗證的用戶)應具備的所有權限和同爲當局?

例子:

如果誰添加條目也應該具有讀訪問權的用戶我調用此一次:

acl.insertAce(acl.getEntries().size(), BasePermission.READ, recipient, true); 

等等?這是它應該被正確使用的方式嗎?

這是正常的,既有權威機構和校長在ACL或只是校長。我的意思是,你混在@PreAuthorizehasRole('ROLE_ADMIN')hasPermission(...)或者你有在ACL兩校長和主管部門,所以你只能使用hasPermission(...)

回答

1

默認情況下,當Spring Security的ACL評估將採取許可考慮更高的權限。例如,如果您具有CREATE(2)權限,則自動錶示您具有READ(1)權限。出於某種原因,我很難找到這個特定的查詢,這是他們的默認策略impls之一。因此,在創建權限後,您不必授予讀取權限。

至於結合角色和權限檢查,完全正常的做。例如,在我的應用系統中,管理員(ROLE_ADMIN)是可以做任何事情的超級用戶,例如,更新其他用戶的數據,所以這裏是我如何檢查當前用戶可以更新實體,其中#entity是要更新的實際對象:

@PreAuthorize("hasPermission(#entity, 'ADMINISTRATION') or hasRole('ROLE_ADMIN')") 

如果你想更細粒度的權限,你可以使用安全組。例如,在我的應用程序中,用戶宣傳他們教授的不同課程,可以在全球範圍內教授課程([email protected]可以在任何地方教授課程),在健身房級別(任何123號健身房的教練都可以教這門課)健身教練級別([email protected]可以在健身房ID 123教授此課程)。爲了支持這樣的事情,你需要有3個級別的權限:

全球:[email protected] - >這是一個SidPrincipal

健身房:GYM_123_TRAINERS - >這是一個GrantedAuthoritySid

健身房,教練:[email protected] - >這是一個GrantedAuthoritySid

當,我遍歷所有,他任教於體育館用戶登錄並添加GYM_ID_TRAINERS作用,以確定他爲部分健身房教練組,以及GYM_ID_TRAINERS-用戶名角色在該健身房中將他標識爲他。

+0

謝謝。一個問題,但。你是否在'acl_entry'表中插入了一個用於ROLE_ADMIN的ACE,即使你使用'hasRole('...')'? – LuckyLuke

+0

我個人不會將ROLE_ADMIN插入到acl_entry中。如果您選擇將其插入到acl_entry表中,則可以跳過此檢查「hasRole('ROLE_ADMIN')」。如果你的用戶是'ROLE_ADMIN',那麼他將在他授權的權限列表中出現這個角色 - 這是Spring Security ACL在評估有權時要檢查的內容(#entity,'ADMINISTRATION') - 它會做與通過調用hasRole來手動檢查它。 – SergeyB

+0

Okey,謝謝。我會盡你所能去做,如果由於某種原因,我會稍後改變:) – LuckyLuke