您在混淆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顯示一個人如何與另一個人工作)。
讓我知道這是否需要進一步解釋。
謝謝。