【发布时间】:2012-12-09 02:37:27
【问题描述】:
我想在 Symfony 2 中使用 ACL 并将它们加载到我的设备中。
以下代码完美运行,但如果我取消注释 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);
}
【问题讨论】:
标签: symfony acl symfony-2.1 fixtures