嗯,这就是我使用一点旧的Symfony2版本(2.0-RC6)时得到的结果。似乎__construct
RoleSecurityIdentity
中存在一个错误(在2010年12月报道)。
而不是instance of Role
,它应该是instance of RoleInstance
。
我应该关闭这个问题......
我对ACL
中的整个Symfony2
概念很陌生,但我理解它背后的基础知识。昨晚我试图让下一个场景工作:
我有2个用户角色(ROLE_GROUP1
,ROLE_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
对象角色。
答案 0 :(得分:0)
只是为了将此问题标记为已解决。
嗯,这就是我使用一点旧的Symfony2版本(2.0-RC6)时得到的结果。似乎在RoleSecurityIdentity的__construct中存在一个错误(在2010年12月报道)。
而不是Role的实例,它应该是RoleInstance的实例。
我应该关闭这个问题......