我希望能够验证是否将属性(角色)授予UserInterface
在 Symfony2 中实现的任意对象。这可能吗?
UserInterface->getRoles()
不适合我的需求,因为它没有考虑角色层次结构,我宁愿不在那个部门重新发明轮子,这就是为什么我想尽可能使用 Access Decision Manager。
谢谢。
针对以下 Olivier 的解决方案,这是我的经验:
您可以将 security.context 服务与 isGranted 方法一起使用。您可以传递第二个参数,即您的对象。
$user = new Core\Model\User();
var_dump($user->getRoles(), $this->get('security.context')->isGranted('ROLE_ADMIN', $user));
输出:
array (size=1)
0 => string 'ROLE_USER' (length=9)
boolean true
我的角色层次结构:
role_hierarchy:
ROLE_USER: ~
ROLE_VERIFIED_USER: [ROLE_USER]
ROLE_ADMIN: [ROLE_VERIFIED_USER]
ROLE_SUPERADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
ROLE_ALLOWED_TO_SWITCH: ~
我的UserInterface->getRoles()
方法:
public function getRoles()
{
$roles = [$this->isVerified() ? 'ROLE_VERIFIED_USER' : 'ROLE_USER'];
/**
* @var UserSecurityRole $userSecurityRole
*/
foreach ($this->getUserSecurityRoles() as $userSecurityRole) {
$roles[] = $userSecurityRole->getRole();
}
return $roles;
}
ROLE_ADMIN
必须显式分配,即使用户刚刚创建并且没有被分配除默认角色之外的任何角色,只要当前登录的用户被授予,也会isGranted('ROLE_ADMIN', $user)
返回。这使我相信第二个参数 to只是被忽略了,而是使用提供的 to 。TRUE
ROLE_USER
ROLE_ADMIN
isGranted()
Token
AccessDecisionManager->decide()
SecurityContext
如果这是一个错误,我将提交报告,但也许我仍然做错了什么?