symfony中的控制器中无法访问用户对象

symfony中的控制器中无法访问用户对象,symfony,Symfony,我试图在symfony中使用自动登录功能,比如触发登录事件并设置用户对象。用户对象在该控制器中可用,但当我尝试使用其他控制器时,用户对象显示为annon,而不是显示登录的用户信息 控制器A private function autoLogin($request, $username) { $em = $this->getDoctrine()->getManager(); if (!$usr = $em->getRepository('AppBundle:Use

我试图在symfony中使用自动登录功能,比如触发登录事件并设置用户对象。用户对象在该控制器中可用,但当我尝试使用其他控制器时,用户对象显示为annon,而不是显示登录的用户信息

控制器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 }           

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

最可能的问题是您的用户没有持久化到会话中<代码>Symfony\Component\Security\Http\Firewall\ContextListener对此负责。如果您查看
onKernelResponse()
方法,您可以了解它是如何实现的。基本上,它从令牌存储中获取令牌,将其序列化并存储到会话中。对于请求,它执行相反的操作:从会话中获取令牌并将其放入令牌存储

我建议您使用防火墙的配置,并设置如下内容:

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

在这种情况下,上下文监听器将被称为执行会话相关的工作,您的代码应该可以工作。

我不确定您要做什么。您是否在控制器中登录用户,然后在下一页显示用户未登录?或者您是否将您的请求从一个控制器转发到另一个控制器?如果您还可以提供security.yml文件,那就太好了。@Stepashka。我已使用security.yml文件内容编辑了我的问题。我正在尝试登录控制器,但在下一页,用户似乎没有登录。对象显示为annon。