Как определить, выдается ли пользователь в Symfony2?
В приложении, создаваемом с помощью Symfony2, мы хотим, чтобы superadmins могли олицетворять других пользователей. Это легко сделать, предоставив суперсуществующему пользователю роль ROLE_ALLOWED_TO_SWITCH. Коммутация реализована с вызовом "где-то? _switch_user =", как предложено в справочной документации.
Однако проблема заключается в том, чтобы обнаруживать в шаблоне, если текущий пользователь фактически олицетворен, чтобы напечатать ссылку на "где-то? _switch_user = _exit" на странице, что позволяет олицетворяющему пользователю вернуться к ее реальному пользователю.
Ответы
Ответ 1
Я не использовал 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 ?>
Ответ 2
Пример того, как получить более подробную информацию об имперсонаторе:
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.
Ответ 3
Пример того, как отображать имперсонатор в ветке:
{% 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 %}