Symfony 2 ACLs 插入类访问控制项

3

我正在使用Symfony acls,并且注意到当第一次创建类acl时,会创建一个object_identifier = class的acl_object_identities。

但是如果您插入ace类(acl_entries),则object_identity_id设置为NULL。我想知道为什么之前创建的acl_object_identity没有被使用?

acl_class表: 6 xxxxxxxx/myclass

acl_object_identities表: 63 NULL 6 class 1

acl_entries表: 199 6 NULL 1 NULL 3 1073741823 1 all 0 0

不应该是这样吗? 199 6 63 1 NULL 3 1073741823 1 all 0 0

我不明白为什么创建了一个identity objet类,但没有与类条目一起使用。

这是我的代码,也许有些问题:

//find or create acl
$classIdentity = new ObjectIdentity('class', ClassUtils::getRealClass($class));
$aclProvider = $this->getService('security.acl.provider');
 try {
        $acl = $aclProvider->findAcl($classIdentity);
    } catch (AclNotFoundException $e) {
        $acl = $aclProvider->createAcl($classIdentity);
    }

//insert class aces 
$maskBuilder = new MaskBuilder(128);
$securityId = new RoleSecurityIdentity('ROLE_ADMIN');
$acl->insertClassAce($securityId, $maskBuilder->get());
$aclProvider->updateAcl($acl);

谢谢

1个回答

1
我希望我正确地理解了你的问题。 表仅包含对象标识。即使您创建基于类作用域的ACE,也必须提供有效的对象标识,并通过使用名为的“虚拟”标识符来实现。理论上,这可以是任何东西,除了或空字符串。在这些情况下,使用是一种常见惯例。
请记住,ACL可以理论上具有对象范围ACE和全局范围ACE(即使没有字段)。如果表中不存在(虚拟)对象标识,则无法直接使用ACL进行更新、删除等操作。
当没有对象存在时检查权限时,另一个要直接访问此类ACL的原因是:
 $objectIdentity = new ObjectIdentity('class', 'The\Namespaced\Class');
 if ($context->isGranted('CREATE', $objectIdentity)) {
    ... // seems you are allowed to create objects of this class
 }

这将有助于检查类的“全局”CREATE权限。

acl_entries表包含所有ACE,包括对象范围和类范围的ACE。当object_identity_id设置为NULL时,条目是类范围的ACE,否则它是对象范围的ACE。类范围的ACE只需要知道使用哪个类,不关心对象标识,这就是为什么此字段可以为空的原因。在这些情况下,class_id字段用于确定类类型。

理论上,他们可以从acl_entries中删除class_id列,并始终使用object_identity_id,因为该表还链接到class_id。但是,这将需要额外的连接,并且我们仍然需要在ace_table中添加某个地方,以指示条目是类范围的ACE还是对象范围的ACE。

请记住,ACL的许多内容都是出于效率和速度的考虑编写的,这有时会降低可读性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接