2016-12-28 38 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

我假设你没有使用任何安全设置,并在用户刷新页面后调用第二个控制器。

最可能的问题是您的用户没有被保存到会话中。 Symfony\Component\Security\Http\Firewall\ContextListener负责。如果你看看onKernelResponse()方法,你可以看看它是如何做到的。基本上它从令牌存储获取令牌,将其序列化并存储到会话中。在请求上做的相反:从会话获取令牌并将其放置到令牌存储。

我建议你使用防火墙的配置玩和设置是这样的:

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

在这种情况下上下文侦听器将被称为做会话相关的东西,你的代码应该工作。

相关问题