2016-12-28 7 views
0

symfonyで自動ログイン機能を使用しようとしていますが、ログインイベントを発生させてユーザオブジェクトを設定しています。ユーザオブジェクトは、そのコントローラで利用可能ですが、私は他のコントローラを使用しようとすると、ユーザーオブジェクトではなく、ユーザ情報でログインして示すのannonは述べていますsymfonyのコントローラでユーザオブジェクトにアクセスできない

コントローラーA

private function autoLogin($request, $username) 
{ 
    $em = $this->getDoctrine()->getManager(); 

    if (!$usr = $em->getRepository('AppBundle:User')->findOneBy(['username' => $username])) { 
     throw $this->createNotFoundException('User does not exist'); 
    } 

    $token = new UsernamePasswordToken($usr, $usr->getPassword(), "secured_area", $usr->getRoles()); 
    $this->get('security.token_storage')->setToken($token); 

    $loginEvent = new InteractiveLoginEvent($request, $token); 
    $this->get("event_dispatcher")->dispatch("security.interactive_login", $loginEvent); 

    $user = $this->get('security.token_storage')->getToken()->getUser(); 
    dump($user); // can see user object without any issue 

    if (!$this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) { 
     throw new AccessDeniedException(); 
    } 

    return $usr; 
} 

コントローラーB

public function editAction(Request $request) 
{ 
    $user = $this->get('security.token_storage')->getToken()->getUser(); 
    print_r($user); // result is annon. 
} 

のsecurity.yml

security: 
    encoders: 
     AppBundle\Entity\User: 
      algorithm: bcrypt 

    providers: 
     doctrine_provider: 
      entity: 
       class: AppBundle:User 
       property: username 

    firewalls: 
     dev: 
      pattern: ^/(_(profiler|wdt)|css|images|js)/ 
      security: false 

     secured_area: 
      anonymous: ~ 
      provider: doctrine_provider 
      pattern: ^/ 

      form_login: 
       login_path: security_login 
       check_path: security_login 
       csrf_token_generator: security.csrf.token_manager 

      logout: 
       path: /logout 
       target: /login 

    access_control: 
     - { path: ^/.*, roles: IS_AUTHENTICATED_ANONYMOUSLY }   
+0

私はあなたがしようとしていることがはっきりしていないと思います。あなたはコントローラでユーザにログインし、次のページではユーザはログインしていないように見えますか?または、あるコントローラから別のコントローラに要求を転送しますか? – Stepashka

+0

security.ymlファイルも提供できればいいですね。 – Stepashka

+0

@Stepashka。 security.ymlファイルの内容で質問を編集しました。コントローラにログインしようとしていて、次のページのユーザがログインしていないように見えます。オブジェクトにはannonが表示されます。 – user1965773

答えて

0

セキュリティ設定を使用していないと仮定し、2番目のコントローラは、ユーザーがページを更新した後に呼び出されます。

最も可能性の高い問題は、ユーザーがセッションに保持されていないことです。 Symfony\Component\Security\Http\Firewall\ContextListenerはそれに責任があります。 onKernelResponse()メソッドを見ると、それがどのように機能するのかがわかります。基本的に、トークンストレージからトークンを取得し、シリアル化してセッションに格納します。リクエストでは、それは反対のことを行います:セッションからトークンを取得し、それをトークン・ストレージに置きます。セッション関連のものをやって呼び出されます。この場合のコンテキストリスナーで

firewalls: 
    autologin: 
     pattern: /autologinUrl/ 
     context: autologing 

をし、あなたのコードは動作するはずです:

私は、ファイアウォールの設定で再生すると、このようなものを設定することをお勧めしたいです。

関連する問題