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

d5vmydt9  于 2023-08-06  发布在  其他
关注(0)|答案(5)|浏览(82)

在使用Symfony2构建的应用程序中,我们希望超级管理员能够模拟其他用户。这很容易做到,方法是给超级管理员用户ROLE_ALLOWED_TO_SWITCH角色。切换是通过调用“某处?_switch_user=”,如参考文档中所建议。
然而,问题是在模板中检测当前用户是否实际上是模拟的,以便打印到“某处?_switch_user=_exit”,从而使模拟用户能够返回到她的真实的用户。

uqcuzwp8

uqcuzwp81#

我已经有一段时间没有使用Symfony2了,所以我不确定,但是当你切换到另一个用户时,你会获得分配给该用户的所有角色和一个额外的角色:ROLE_PREVIOUS_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 ?>

字符串

pwuypxnk

pwuypxnk2#

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

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。

nzkunb0c

nzkunb0c3#

一个如何在tig中显示模拟器的示例:

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

字符串

i2loujxw

i2loujxw4#

如果您需要从上一个管理员用户测试角色:
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 %}

字符串

xdnvmnnf

xdnvmnnf5#

要获取控制器中的原始用户,可以使用以下代码:

$token = $this->container->get('security.token_storage')->getToken();
if ($token instanceof \Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken) {
    $impersonatorUser = $token->getOriginalToken()->getUser();
}

字符串

相关问题