以编程方式登录Symfony中的用户需要刷新

时间:2017-01-31 14:33:58

标签: symfony

我使用了一个事件监听器,它在其他所有事情之前做了一些验证和其他事情。有一件事是内部"如果有基本身份验证用户(PHP_AUTH_USER)设置,请登录用户。

如果设置了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);

1 个答案:

答案 0 :(得分:0)

nehalist所述,通过手动分配用户对象来解决此问题。

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