如何在symfony中用id而不是用户名模仿用户?

时间:2016-06-23 14:17:21

标签: symfony

我无法想象用户的ID是如何模仿用户而不是用户在Symfony中的用户名?

以下使用用户名的技巧无法使用id,因为symfony正在寻找用户名:

?_switch_user={id}

问候。

PS:对不起我的英文。

1 个答案:

答案 0 :(得分:1)

如果没有实现自己的防火墙侦听器,这是不可能的,因为它在后台从userprovider加载用户(在其界面中只有loadUserByUsername()方法)。

然而,您可以实现自己的防火墙侦听器,并通过查看Symfony\Component\Security\Http\Firewall\SwitchUserListener中的代码获得灵感。有关实施自己的身份验证提供程序的详细信息,请查看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可以切换到指定的用户。