如何识别用户是否在Symfony2中被模拟?

Ale*_*ski 22 impersonation symfony

在使用Symfony2构建的应用程序中,我们希望superadmins能够模仿其他用户.通过为superadmin用户提供ROLE_ALLOWED_TO_SWITCH角色,可以轻松完成此操作.通过调用"somewhere?_switch_user ="来实现切换,如参考文档中所述.

然而,问题是在模板中检测当前用户是否实际被模拟,以便在页面上打印到"某处?_switch_user = _exit"的链接,从而使模仿用户能够返回到她的真实用户.

Cro*_*zin 31

我有一段时间没有使用Symfony2所以我不确定,但当你切换到另一个用户时,你获得分配给该用户的所有角色和一个额外的角色:ROLE_PREVIOUS_ADMIN.所以我想你需要做的就是使用选民来检查是否使用选民将这样的角色分配给当前用户.

// Twig

{% if is_granted('ROLE_PREVIOUS_ADMIN') %}
    <a href="...?_switch_user=_exit">EXIT</a>
{% endif %}

// PHP

<?php if ($view['security']->isGranted('ROLE_PREVIOUS_ADMIN')): ?>
    <a href="...?_switch_user=_exit">EXIT</a>
<?php endif ?>
Run Code Online (Sandbox Code Playgroud)

  • 无论如何都要获得模仿者的身份?对于模仿者正在进行更新并且我们希望审计跟踪识别模仿者的原始ID的情况,这将非常有用. (2认同)

Sir*_*ara 18

有关如何获取有关模仿者的更多详细信息的示例:

use Symfony\Component\Security\Core\Role\SwitchUserRole;


$sec = $this->get('security.context');

if($sec->isGranted('ROLE_PREVIOUS_ADMIN')) {
  foreach($sec->getToken()->getRoles() as $role) {
    if ($role instanceof SwitchUserRole) {
      $admin_user = $role->getSource()->getUser();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,您将admin_user作为原始用户对象.请记住使用SwitchUserRole.

  • +1给我你的地址,我会发给你饼干. (2认同)