解决方案
好吧,这就是我使用有点旧的 Symfony2 版本(2.0-RC6)时得到的结果。似乎有一个错误__construct
(RoleSecurityIdentity
在 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 的代码,发现权限授予equals
在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()
是string
“ ROLE_GROUP1 ”,而是 ROLE_GROUP1角色$this->role
的Role
对象。