Это невозможно обойтись без реализации собственного прослушивателя брандмауэра, поскольку за кулисами он загружает пользователя из userprovider (который имеет только интерфейс loadUserByUsername() в своем интерфейсе).
Однако вы можете реализовать свой собственный прослушиватель брандмауэров и получить вдохновение, взглянув на код в . Для получения подробной информации о внедрении собственного поставщика проверки подлинности проверьте cookbook article.
EDIT:
Одним из возможных решений может быть регистрирующий дополнительный запрос слушателя:
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class LookupSwitchUserListener implements EventSubscriberInterface
{
private $repository;
public function __construct(UserRepository $repository)
{
$this->repository = $repository;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => ['lookup', 12] // before the firewall
];
}
public function lookup(GetResponseEvent $event)
{
$request = $event->getRequest();
if ($request->has('_switch_user') {
return; // do nothing if already a _switch_user param present
}
if (!$id = $request->query->has('_switch_user_by_id')) {
return; // do nothing if no _switch_user_by_id param
}
// lookup $username by $id using the repository here
$request->attributes->set('_switch_user', $username);
}
}
Теперь зарегистрировать этот приемник в контейнере службы:
services:
my_listener:
class: LookupSwitchUserListener
tags:
- { name: kernel.event_subscriber }
Вызов URL с ?_switch_user_by_id=xxx
параметр должен теперь правильно искать имя пользователя и устанавливать его так, чтобы SwitchUserListener мог переключиться на указанного пользователя.
Многое спасибо. –
В случае использования пользователя FOS, есть ли другой способ? –
Я бы предложил просто использовать имена пользователей. Вы можете сделать «админ» контроллер между вещами, который ищет пользователя по его идентификатору и отображает ссылку с правильным параметром запроса '_switch_user'. – Gerry