我无法想象用户的ID是如何模仿用户而不是用户在Symfony中的用户名?
以下使用用户名的技巧无法使用id,因为symfony正在寻找用户名:
?_switch_user={id}
问候。
PS:对不起我的英文。
答案 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可以切换到指定的用户。