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

如何识别用户是否在Symfony2中被模拟?,symfony,impersonation,Symfony,Impersonation,在使用Symfony2构建的应用程序中,我们希望超级管理员能够模拟其他用户。通过给superadmin用户角色\u ALLOWED\u TO \u SWITCH ROLE,可以很容易地做到这一点。切换是通过调用参考文档中建议的“某处”\u switch\u user=“来实现的 然而,问题是在模板中检测当前用户是否真的被模拟,以便在页面上打印指向“某处”\u switch\u user=\u exit”的链接,从而使模拟用户能够返回到她的真实用户。我已经有一段时间没有使用Symfony2了,所以

在使用Symfony2构建的应用程序中,我们希望超级管理员能够模拟其他用户。通过给superadmin用户角色\u ALLOWED\u TO \u SWITCH ROLE,可以很容易地做到这一点。切换是通过调用参考文档中建议的“某处”\u switch\u user=“来实现的


然而,问题是在模板中检测当前用户是否真的被模拟,以便在页面上打印指向“某处”\u switch\u user=\u exit”的链接,从而使模拟用户能够返回到她的真实用户。

我已经有一段时间没有使用Symfony2了,所以我不确定,但当您切换到另一个用户时,您将获得分配给该用户的所有角色和一个额外角色:
role\u PREVIOUS\u ADMIN
。所以我想你需要做的就是使用voter来检查这样一个角色是否分配给使用voter的当前用户

// 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 ?>
//小树枝
{%if_被授予('ROLE_PREVIOUS_ADMIN')%}
{%endif%}
//PHP

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

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

如何在细枝中显示模拟程序的示例:

{% 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 %}

如果需要从以前的管理员用户测试角色:

关于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 %}

是否仍然需要获取冒充者的id?这对于模拟程序正在进行更新,并且我们希望审核跟踪能够识别模拟程序的原始id的场景非常有用。@anushr:是的,使用
?\u switch\u user=\u exit
(至少从那时起就存在)。但是,值得注意的是,如果您的用户上有外键,安防将不会有水合物品您知道如何在Symfony3中进行此操作吗?
app.security
变量已被弃用并删除,现在我们正在更新到最新版本,我正在寻找替代方案。@FighterJet使用
app.token\u存储
而不是app.security
app.token\u存储
似乎不可用,根据…“app.token\u存储.token.roles”这对我不起作用。我必须检查相同的条件{%if role.role=='role\u PREVIOUS\u ADMIN'%}{{role.source.user.username}{%endif%}请帮助我如何检查“role\u PREVIOUS\u ADMIN”?@mobize从Symfony 3.2开始,
app
变量有一个
getToken()
方法,因此您可以通过
app.token
(). 对于当前的主分支(4.2-DEV),情况仍然如此。