0

解决方案

好吧,这就是我使用有点旧的 Symfony2 版本(2.0-RC6)时得到的结果。似乎有一个错误__constructRoleSecurityIdentity在 10 年 12 月报告)。

而不是instance of Role应该是instance of RoleInstance.

我可能应该关闭这个问题......


我对整个ACL概念很陌生,Symfony2但我了解它背后的基础知识。昨晚我试图让下一个场景工作:

我有 2 个用户角色 ( ROLE_GROUP1, ROLE_GROUP2),我想为其中一个组设置对象级别 ACL。如果用户ROLE_GROUP1已登录,则应将此角色放入ACE,否则应放入ROLE_GROUP2

到目前为止,我编写了这段代码(实际上与官方文档几乎相同):

$role = $this->getRole(); // returns ROLE_GROUP1 role object

$acl_provider = $this->get('security.acl.provider');

$objIdentity = ObjectIdentity::fromDomainObject($object); // my object

$acl = $acl_provider->createAcl($objIdentity);

$securityIdentity = new RoleSecurityIdentity($role->getRole()); // Role based identity

$acl->insertObjectAce($securityIdentity, MaskBuilder::MASK_OWNER);
$acl_provider->updateAcl($acl);

据我了解,这应该将所有权限授予具有ROLE_GROUP1角色的用户。我错了吗?

为了检查权限,我使用了这段代码(同样,来自官方文档):

$context = $this->get('security.context');

if ( false === $context->isGranted("EDIT", $object) ){
    throw new AccessDeniedException();
}

...但它总是失败(即引发异常)。

我查看了 ACL 表,就我所见,一切似乎都很正常。

我对 RoleSecurityIdentity 做错了吗?有没有办法实现这种情况?

任何帮助将非常感激!

编辑

我刚刚深入研究了 Symfony 的代码,发现权限授予equalsRoleSecurityIdentity.

if (!$sid instanceof RoleSecurityIdentity) {
    return false;
}

/** I ADDED THIS IF CHECK TO SEE WHAT DOES IT COMPARE WITH **/
if ( $this->role->getName() == "ROLE_GROUP1" ){
    die("<pre>" . print_r($sid->getRole(),1) . "</pre><pre>" . print_r($this->role,1) . "</pre><pre>" . print_r($this->role === $sid->getRole(),1) . "</pre>");
}

return $this->role === $sid->getRole();

原来$sid->getRole()stringROLE_GROUP1 ”,而是 ROLE_GROUP1角色$this->roleRole对象。

4

1 回答 1

0

只是将此问题标记为已解决。


解决方案:

好吧,这就是我使用有点旧的 Symfony2 版本(2.0-RC6)时得到的结果。RoleSecurityIdentity 的 __construct 似乎存在错误(在 10 年 12 月报告)。

而不是 Role 的实例,它应该是 RoleInstance 的实例。

我可能应该关闭这个问题......

于 2012-09-26T21:13:04.833 回答