我使用了一个事件监听器,它在其他所有事情之前做了一些验证和其他事情。有一件事是内部"如果有基本身份验证用户(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);
答案 0 :(得分:0)
如nehalist所述,通过手动分配用户对象来解决此问题。
$userEntity = $this->em->getRepository('AppBundle:User')->findOneBy(['username' => $user]);
$this->container->get('security.token_storage')->getToken()->setUser($userEntity);