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

时间:2011-06-16 12:22:34

标签: symfony impersonation

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

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

4 个答案:

答案 0 :(得分: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 ?>

答案 1 :(得分: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();
    }
  }
}

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

答案 2 :(得分:2)

如何在树枝中显示模仿的示例:

{% if is_granted('ROLE_PREVIOUS_ADMIN') %}
  {% for role in app.security.token.roles %}
    {% if role.role == 'ROLE_PREVIOUS_ADMIN' %}
      {{ role.source.user.username }}
    {% endif %}
  {% endfor %}
{% endif %}

答案 3 :(得分:0)

如果您需要测试前一个管理员用户的角色:

使用Symfony 3.4

{% if is_granted('ROLE_PREVIOUS_ADMIN') %}
    {% for role in app.token.roles %}
        {% if role.role == 'ROLE_PREVIOUS_ADMIN' %}
            {% for role_from_previous in role.source.roles if role_from_previous.role == "ROLE_DELETE" %}
                {{ role.source.user.username }} has "ROLE_DELETE"
            {% endfor %}
        {% endif %}
    {% endfor %}
{% endif %}