Symfony2 ACL检查始终返回FALSE

时间:2012-04-20 20:17:48

标签: symfony acl role

嗯,这就是我使用一点旧的Symfony2版本(2.0-RC6)时得到的结果。似乎__construct RoleSecurityIdentity中存在一个错误(在2010年12月报道)。

而不是instance of Role,它应该是instance of RoleInstance

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


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

我有2个用户角色(ROLE_GROUP1ROLE_GROUP2),我想为其中一个群组设置对象级 ACL。如果登录了ROLE_GROUP1的用户,则应将此角色添加到ACE,否则应将ROLE_GROUP2放入。{/ p>

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

$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的代码,发现equals的{​​{1}}方法中的权限授予失败。

RoleSecurityIdentity

事实证明,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() ROLE_GROUP1 ”而string ROLE_GROUP1 $this->role对象角色。

1 个答案:

答案 0 :(得分:0)

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


解决方案:

嗯,这就是我使用一点旧的Symfony2版本(2.0-RC6)时得到的结果。似乎在RoleSecurityIdentity的__construct中存在一个错误(在2010年12月报道)。

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

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