【发布时间】:2018-01-05 19:01:30
【问题描述】:
我正在尝试构建一个系统,允许某些用户组切换到一定数量的用户,而管理员组可以切换到任何用户。我的用户管理器由FOSUserBundle 提供,我已经设置了安全投票器来实现这一点,在切换发生后检查用户角色。我在用户切换后运行的主(主页)控制器的第一行创建了一个名为'IMPERSONATION' 的新投票者属性并调用了denyAccessUnlessGranted。
在我的选民中,我首先获取模拟用户和模拟用户的用户对象。我尝试通过执行以下操作来获取模拟用户(如 here 所述)。
foreach ($tokenStorage->getToken()->getRoles() as $role) {
if ($role instanceof SwitchUserRole) {
$impersonatorUser = $role->getSource()->getUser();
break;
}
然后,如果$impersonatorUser 是超级管理员,我想返回 true(授予访问权限):
if ($impersonatorUser->isSuperAdmin()) { return true; }
// ..
// ... other voter logic
但是,当我尝试将用户从具有ROLE_SUPER_ADMIN 角色的用户切换到具有非管理员角色的用户时,此行永远不会执行。当我做var_dump时,发现$impersonatorUser->isSuperAdmin()返回false,而$impersonatorUser->getRoles显示用户只有ROLE_USER角色。并且由于这行之后的逻辑返回 false,因此投票者拒绝访问,并且切换导致 Access Denied 错误。
用户在切换后似乎失去了ROLE_SUPER_ADMIN 角色。这是 FosUserBundle 的错误吗?
我的角色层次设置如下:
role_hierarchy:
ROLE_ADMIN: ROLE_MENTOR
ROLE_SUPER_ADMIN: ROLE_ADMIN
用户切换选项设置如下:
switch_user: { role: ROLE_MENTOR }
如何在切换前检查用户的角色,从而控制谁可以切换用户?
【问题讨论】:
标签: symfony fosuserbundle