Symfony 2 Acls insertClassAces

时间:2014-10-13 15:51:12

标签: php symfony

我正在使用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全0 0

应该是这个吗? 199 6 63 1 NULL 3 1073741823 1全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 个答案:

答案 0 :(得分:1)

我希望我已经正确地阅读了你的问题。

acl_object_identities表仅包含:对象标识。即使您创建基于类的作用域ACE,也必须提供有效的对象标识,并使用名为class的“虚拟”标识符。从理论上讲,除了NULL或空字符串之外,这可能是任何事情。在这些情况下,使用class是一种常见的惯例。)

请记住,理论上ACL可以混合使用对象范围ACE和全局范围ACE(即使有或没有字段)。如果acl_object_identities表中没有(虚拟)对象标识,则不能直接使用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字段来计算类类型。

理论上,他们可能已从class_id中移除了acl_entries列,而是始终使用object_identity_id,因为该表还包含指向class_id的链接。但是,这需要额外的连接,我们仍然需要在ace_table中添加某个位置,无论该条目是类范围ACE还是对象范围ACE。

请记住,有很多关于ACL的内容是出于效率和速度原因而编写的,这有时会降低可读性。