2016-06-23 3 views
0

Я не могу понять, как олицетворять пользователя по идентификатору пользователя, а не по имени пользователя в Symfony?Как олицетворять пользователя по id вместо имени пользователя в symfony?

следующие рекомендации, которые работают с именем пользователя не может работать с идентификатором, поскольку Symfony ищет имя пользователя:

?_switch_user={id} 

С уважением.

PS: Извините за мой английский.

ответ

1

Это невозможно обойтись без реализации собственного прослушивателя брандмауэра, поскольку за кулисами он загружает пользователя из 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 мог переключиться на указанного пользователя.

+0

Многое спасибо. –

+0

В случае использования пользователя FOS, есть ли другой способ? –

+1

Я бы предложил просто использовать имена пользователей. Вы можете сделать «админ» контроллер между вещами, который ищет пользователя по его идентификатору и отображает ссылку с правильным параметром запроса '_switch_user'. – Gerry

Смежные вопросы