Как определить, что пользователь выдает себя за Symfony2? - PullRequest
22 голосов
/ 16 июня 2011

В приложении, созданном с Symfony2, мы хотим, чтобы superadmins мог выдавать себя за других пользователей. Это легко сделать, предоставив пользователю superadmin роль ROLE_ALLOWED_TO_SWITCH. Переключение осуществляется с помощью вызова «где-то? _Switch_user =», как предлагается в справочной документации.

Проблема, однако, заключается в том, чтобы обнаружить в шаблоне, действительно ли текущий пользователь выдает себя за другого, чтобы напечатать на странице ссылку «где-то? _Switch_user = _exit», что позволяет пользователю, подражающему себе, вернуться к своему реальному пользователю.

Ответы [ 4 ]

31 голосов
/ 17 июня 2011

Я некоторое время не использовал 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 ?>
18 голосов
/ 01 февраля 2012

Пример того, как получить более подробную информацию об имитаторе:

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 голосов
/ 28 марта 2013

Пример того, как отобразить имитатор в ветке:

{% 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 %}
0 голосов
/ 26 апреля 2018

Если вам нужно проверить роль от предыдущего администратора:

Работа в 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 %}
...