2016-06-23 1 views
0

私はSymfonyのユーザのユーザ名ではなく、ユーザのIDで自分を偽装する方法を理解できませんか?symfonyのusernameの代わりにidでユーザを偽装するには?

symfonyはユーザ名を探していると、IDと連携することができませんユーザー名と連携し、次のトリック:

?_switch_user={id} 

よろしく。

PS:申し訳ありません、私の英語です。

答えて

1

独自のファイアウォールリスナーを実装せずに行うことは、userprovider(インターフェースにloadUserByUsername()メソッドのみを持つ)からユーザーをロードする舞台裏では不可能です。

しかし、あなた自身のファイアウォールリスナーを実装して、というコードを見てもらえます。独自の認証プロバイダの実装の詳細については、cookbook articleを参照してください。

EDIT:

一つの可能​​な解決策余分な要求リスナ登録されることがあります。

services: 
    my_listener: 
     class: LookupSwitchUserListener 
     tags: 
      - { name: kernel.event_subscriber } 

?_switch_user_by_id=xxxとURLを呼び出す:

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); 
    } 
} 

今すぐサービスコンテナでこのリスナーを登録しますパラメータが正しくユーザ名を検索し、SwitchUserListenerが指定されたユーザに切り替えるように設定する必要があります。

+0

多くの多くのありがとうございます。 –

+0

FOSユーザーの場合、別の方法がありますか? –

+1

代わりにユーザー名を使用することをお勧めします。あなたは物事の間に "admin"コントローラを作ることができます。コントローラーはIDでユーザーを検索し、正しい '_switch_user'クエリパラメーターでリンクを表示します。 – Gerry

関連する問題