Symfony2:如何在模拟用户帐户时显示管理员帐户名称?

6

我想要展示如下内容:

场景1:登录为USER

@ UserName [ 退出 ]

这里没有问题,只需要这样做:

@ {{ app.user.username}} [ <a href="{{ path("logout") }}">退出</a> ]

场景2:登录为ADMIN

@ AdminName [ 退出 ]

这里也可以使用同样的方法:

@ {{ app.user.username}} [ <a href="{{ path("logout") }}">退出</a> ]

场景3:以管理员身份登录为USER

AdminName @ UserName [ 返回 ]

现在就有问题了:

{{ ??..这里应该填什么..?? }} @ {{ app.user.username}} [ <a href="{{ (app.request.getRequestUri ~ '?_switch_user=_exit') }}">返回</a> ]

这是我所知道的唯一解决方案... 似乎为了简单地显示用户名而编写了很多代码 :/

{# iterating through user roles to find ROLE_PREVIOUS_ADMIN #}
{% for role in app.security.token.roles %}
  {% if role.source is defined %}
    {{ role.source.user.username }}
 {% endif %}
{% endfor %}
@ {{ app.user.username }} [ <a href="{{ (app.request.getRequestUri ~ '?_switch_user=_exit') }}">return</a> ]

还有其他的方法吗?我需要一个纯TWIG的解决方案 -> 这应该是我的主要twig模板的一部分(被所有其他模板扩展) -> 我不能在所有操作中添加控制器代码,只能显示用户名。


你知道如何在Symfony3中实现这个吗?app.security变量已经自v2.6起被弃用,并在v3中被移除 - user5670895
@user5670895 试试这个:https://dev59.com/amPVa4cB1Zd3GeqP5WmX#68294209 - Jonathan
2个回答

4
通过您提出的想法,您可以创建一个自定义twig扩展,将您的逻辑从twig模板中包含进去,这样您就可以在twig模板中调用myCustomTwigFunction,并输出原始用户名称。
有关自定义twig扩展的更多信息,请参见http://symfony.com/doc/current/cookbook/templating/twig_extension.html
您在Twig扩展文件中的代码应该是...
$roles = $this->container->get('security.context')->getToken()->getRoles();
foreach ($roles as $role) {
    if (method_exists($role, 'getSource')) {
        return ($role->getSource()->getUser()->getUsername());
    }
}

这里的$container是你的twig扩展类中DI容器的一个类变量


1

对于寻求Symfony 4.3/4.4/5.0解决方案的任何人:

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

从Symfony 5.1开始,使用IS_IMPERSONATOR代替ROLE_PREVIOUS_ADMIN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接