我想将 ACL 与 Symfony 2 一起使用并将它们加载到我的装置中。
以下代码完美运行,但如果我取消注释,则会array('myprivateroom', 'user1', 'view'),
收到以下错误:
[Symfony\Component\Security\Acl\Exception\AclAlreadyExistsException] ObjectIdentity(1, Acme\RoomBundle\Entity\Room) is already associated with an ACL.
我认为问题就在这里,$acl = $aclProvider-createAcl(ObjectIdentity::fromDomainObject($room));
但我不知道如何解决。
public function load(ObjectManager $manager)
{
$datas = array(
array('myprivateroom', 'admin', 'owner'),
//array('myprivateroom', 'user1', 'view'),
array('mypublicroom', 'user1', 'owner'),
);
foreach ($datas as $data) {
// creating the ACL
$room = $this->getReference($data[0]);
$aclProvider = $this->container->get('security.acl.provider');
$objectIdentity = ObjectIdentity::fromDomainObject($room);
//problem here when I uncomment array('myprivateroom', 'user1', 'view'),
$acl = $aclProvider->createAcl(ObjectIdentity::fromDomainObject($room));
// retrieving the security identity of the user
$user = $this->getReference($data[1]);
$securityIdentity = UserSecurityIdentity::fromAccount($user);
//create mask
$builder = new MaskBuilder();
$builder->add($data[2]);
$mask = $builder->get();
// grant owner access
$acl->insertObjectAce($securityIdentity, $mask);
$aclProvider->updateAcl($acl);
}
}
谢谢
更新:如果我做 2 个数组,比如
$datas = array(
array('myprivateroom', 'admin', 'owner'),
array('mypublicroom', 'user1', 'owner'),
);
$datas2 = array(
array('myprivateroom', 'user1', 'view'),
);
和 2 foreach 但是,在第二个中,我替换$acl = $aclProvider->createAcl(ObjectIdentity::fromDomainObject($room));
为$acl = $aclProvider->findAcl($objectIdentity);
,它工作得很好,但我认为这不是正确的方法,以下不起作用。
try {
$acl = $aclProvider->findAcl($objectIdentity);
} catch (AclNotFoundException $e) {
$acl = $aclProvider->createAcl($objectIdentity);
}