2016-07-05 67 views
2

我對symfony/silex中的ACL非常困惑,以及如何讓它們爲我工作。模塊權限與在silex中的角色權限

我一直在考慮基於模塊 - >動作的解決方案。然而,閱讀關於ACL的知識後,一切似乎都基於角色,這對於我試圖實現的實現來說是廣泛的。

我將有用戶,並且所有用戶確實屬於角色(管理員,用戶等)。然而,角色更多地是你可以做什麼的準則(因爲它設置了具有該角色的用戶的默認權限以用戶可以執行的一組實際操作爲開始)。這些操作實際上基於系統所具有的模塊以及實際授予任何用戶閱讀,添加,更新刪除以及其他任何其他動詞之外的權限。

因此,例如: 角色#1:是管理員

  • 可以讀取用戶
  • 可以發佈用戶
  • 可以把用戶
  • 可以刪除用戶

作用#2:管理員

  • 可以讀取用戶
  • 可以發佈用戶
  • 不能把用戶
  • 不能刪除用戶

由於我打算有幾個diferente模塊(用戶,支付,產品等。 ),並且每個管理員都可以擁有授予或撤消的權限,但他們不適合ROLE_ADMIN,ROLE_SUPER_ADMIN和ROLE_USER類型的角色。

我正在考慮ROLE_VIEW_USERS,ROLE_ADD_USERS,ROLE_EDIT_USERS的問題,並且用戶可能會擁有100個這些小角色,併爲每個控制器決定是否可以執行某些操作。

這是否有意義?

回答

2

您在混淆ACL和角色。他們都與權限有關,但他們的方法和功能彼此不同。

角色並非固有地綁定到特定資源。另一方面,ACL是,而且這個鏈接是持久的。用戶可以通過選民的使用與資源(或似乎如此)聯繫起來。

https://symfony.com/doc/current/security/voters.html#creating-the-custom-voter

用戶特定的訪問控制列表,例如如果用戶有特定的訪問權限定義PER資源,則需要更多的東西。

看看順豐食譜:

https://symfony.com/doc/current/cookbook/security/acl.html https://symfony.com/doc/current/cookbook/security/acl_advanced.html

OWNER/MASTER /操作員可以

  • 編輯
  • 查看
  • 刪除
  • 創建

所有資源(這是使用角色完成)


ROLE_USER CAN

  • 編輯自己的
  • VIEW OWN
  • 刪除自己的
  • CREATE

自己的資源

選民們有效地創建自己的ACL,因此無持續的權限,除非你做出一個明確的(在這一點上,我會去ACL)(此部分與ACL或選民完成)。 ACL的用例基本上與選民的用例相同,選擇一個與另一個相比是一個複雜的問題。

內置ACL信息來自數據庫,但根據SF文檔:「它可以包含數千萬[記錄],而不會顯着影響性能。」

非常簡單?可以使用選民。

如果您不想維護自己的資源規則(選民),並且不介意ACL的複雜性,或者像持久化+緩存的權限一樣,則可以使用ACL。

注意,ACL的複雜性通常是創建資源時(雖然這可能在服務放)以下:

$aclProvider = $this->get('security.acl.provider'); 
$objectIdentity = ObjectIdentity::fromDomainObject($resource); 
$acl = $aclProvider->createAcl($objectIdentity); 
$tokenStorage = $this->get('security.token_storage'); 
$user = $tokenStorage->getToken()->getUser(); 
$securityIdentity = UserSecurityIdentity::fromAccount($user); 
$acl->insertObjectAce($securityIdentity, MaskBuilder::MASK_OWNER); 
$aclProvider->updateAcl($acl); 

對於前面的情況下,你可以使用ROLE_USER確保經過身份驗證的用戶實際上是實際用戶,而不是AUTHENTICATED_ANONYMOUSLY,而選舉人或ACL確保他們只能編輯自己的資源,並且如果他們的ROLE是ROLE_ADMIN,則覆蓋此選項。 (假設用戶註冊後獲得ROLE_USER)

安全示例。陽明海運

# This could be done via @Secure(roles="ROLE_USER") 
access_control: 
    - { path: ^/my/api/endpoint, role: IS_USER, requires_channel: https } 
    - { path: ^/my/admin/api/endpoint, role: IS_ADMIN, requires_channel: https } 

實例控制器::行動

// check for edit access 
if (
    false === $authorizationChecker->isGranted('EDIT', $resource) && 
    false === $this->get('security.context')->isGranted('ROLE_ADMIN') 
) { 
    throw new AccessDeniedException(); 
} 

這裏是StackOverflow的另一QA也提供了一些例子:

Symfony 2 ACL and Role Hierarchy

您也可以使用標註這個東西:

https://symfony.com/doc/current/best_practices/security.html#authorization-i-e-denying-access(It顯示一個人如何與另一個人工作)。

讓我知道這是否需要進一步解釋。

謝謝。