2017-01-31 9 views
1

私は他のものよりも前にいくつかのバリデーションなどを行うイベントリスナーを使用しています。 1つは、基本認証ユーザー(PHP_AUTH_USER)が設定されている場合、ユーザーに「内部的に」ログインすることです。プログラムでsymfonyのユーザにログインするにはリフレッシュが必要です

PHP_AUTH_USERはイベントがであなたをログに記録され発射される設定されている場合:戻る私の要求リスナーで

private function authenticate() 
{ 
    if($this->container->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) { 
     return ; 
    } 

    $token = new UsernamePasswordToken(
     $this->username, // = PHP_AUTH_USER 
     $this->password, 
     $this->container->getParameter('fos_user.firewall_name'), 
     $this->user->getRoles() 
    ); 

    $tokenStorage = $this->container->get('security.token_storage'); 
    $tokenStorage->setToken($token); 

    $event = new InteractiveLoginEvent($this->req, $token); 
    $this->container->get("event_dispatcher")->dispatch("security.interactive_login", $event); 

    return true; 
} 

私が認証userオブジェクトを取得したいのですが、限り、私はリダイレクトされませんよう(ユーザーが実際にログインしていないページを表示したり更新したりすることができます(下記参照)。だから私のログインイベントが発生した後、私はこれを実行する必要があります。

$user = $this->container->get('security.token_storage')->getToken()->getUser(); 
if(! $user instanceof User) { 
        $event->setController(function() use (&$router) { 
         return new RedirectResponse($router->generate('homepage')); 
        }); 
       } 

興味深いことに、ここ$user変数は、ユーザー名を含む単なる文字列です。すべてをリダイレクトした後は、それはオブジェクトです。

実際のUserオブジェクトがgetUserから取得されない限り、多くのメソッドとルートは、Userオブジェクトを取得することに依存しているため動作しません。

:ユーザオブジェクトを手動で割り当てることで修正しました。

$userEntity = $this->em->getRepository('AppBundle:User')->findOneBy(['username' => $user]); 
$this->container->get('security.token_storage')->getToken()->setUser($userEntity); 
+0

あなたは '$ユーザ=の$ this - >、コンテナ>取得( 'security.token_storage')試してみました - >入手トークン() - > getUserメソッド() - >のGetRecordを();'? – Rooneyl

+0

getUser()は文字列 'getRecord'を返すので、文字列に関数を呼び出すことを意味します。あなたがトークン 'UsernamePasswordToken'を作成するときに' – nehalist

+0

メンバ関数を呼び出してgetRecord()を呼び出すと、それはトークンコンストラクタのユーザ名ではなくユーザオブジェクトを使用する場合に機能するかどうかをテストしました。例えば。 ($ userObject、null、$ this-> container-> getParameter( 'fos_user.firewall_name')、$ userObject-> getRoles()); '$ token = new UsernamePasswordToken – Rooneyl

答えて

0

nehalistのように、ユーザーオブジェクトを手動で割り当てることで修正されました。

$userEntity = $this->em->getRepository('AppBundle:User')->findOneBy(['username' => $user]); 
$this->container->get('security.token_storage')->getToken()->setUser($userEntity); 
関連する問題