如何在模仿之前获得用户角色?

时间:2018-01-05 02:19:23

标签: symfony fosuserbundle

我正在尝试构建一个系统,允许某些用户组切换到一定数量的用户,并且管理员组可以切换到任何用户。我的用户管理器由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,选民拒绝访问,并且交换机导致访问被拒绝错误。

用户似乎在切换后失去了ROLE_SUPER_ADMIN角色。这是FosUserBundle的错误吗?

我的角色层次结构设置如下:

role_hierarchy:
    ROLE_ADMIN:       ROLE_MENTOR
    ROLE_SUPER_ADMIN: ROLE_ADMIN

用户切换选项设置如下:

switch_user: { role: ROLE_MENTOR }

如何在切换之前检查用户的角色,以便控制谁可以切换用户?

1 个答案:

答案 0 :(得分:1)

FOSUserBundle仅提供用户管理系统,它与Symfony Security和访问管理无关。

如果您使用symfony切换用户功能来模拟用户,那么您的模拟用户将有一个额外的角色ROLE_PREVIOUS_ADMIN,可以对其进行检查(see documentation)

我不知道实现您的功能的最佳解决方案,但也许这可能有所帮助(Allow switching/impersonating only to particular users in Symfony2