2016-06-23 42 views

回答

1

这是不可能实现自己的防火墙侦听器,因为它从用户提供者(它的接口中只有一个loadUserByUsername()方法)加载用户的幕后。

但是,您可以实现自己的防火墙侦听器,并通过查看中的代码获取灵感。有关实施您自己的身份验证提供程序的详细信息,请检查cookbook article

编辑:

一个可能的解决方案可能会注册一个额外的请求收听:

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 } 

调用与?_switch_user_by_id=xxx一个url参数现在应该正确查找用户名并进行设置,以便SwitchUserListener可以切换到指定的用户。

+0

很多很多谢谢。 –

+0

如果使用FOS用户,有没有其他办法? –

+1

我建议只使用用户名代替。您可以在两个事物之间创建一个“管理员”控制器,通过它的ID查找用户,并显示具有正确'_switch_user'查询参数的链接。 – Gerry