Symfony测试场景下,已登录用户在Twig中app.user为null的问题求助
app.user返回null,但控制器中已登录用户正常可用 我在Twig里使用app.user时碰到了个麻烦:测试单元里已经写了用户登录的逻辑,控制器里能正常拿到登录的用户,但Twig模板里访问app.user却一直返回null。下面是我测试中实现登录的代码:
$user = new User; $user->setRole('ROLE_ADMIN'); $user->setUsername('admin'); $firewallContext = 'main'; $token = new UsernamePasswordToken(serialize($user), null, $firewallContext, array('ROLE_ADMIN')); $session->set('_security_'.$firewallContext, serialize($token)); $session->save(); $cookie = new Cookie($session->getName(), $session->getId()); $this->client->getCookieJar()->set($cookie);
我帮你梳理几个可能的遗漏点,你可以逐一验证:
别把User对象序列化后传给UsernamePasswordToken
UsernamePasswordToken的第一个参数要求是User对象的实例,而不是序列化后的字符串。你现在传了serialize($user),这会让Symfony没法正确识别用户实体,Twig自然拿不到app.user。赶紧改成这样:$token = new UsernamePasswordToken($user, null, $firewallContext, array('ROLE_ADMIN'));用Symfony测试组件的
loginUser方法替代手动操作
手动处理session和cookie很容易出错,Symfony 4.3+的测试组件提供了loginUser方法,能自动帮你搞定所有登录相关的细节,比你手动写的代码靠谱多了。用法超简单:$this->client->loginUser($user);用这个方法的话,你之前写的那一大段session、cookie代码都可以删掉了。
检查防火墙上下文名称是否匹配
确认你代码里的$firewallContext = 'main'和security.yaml里配置的防火墙context值完全一致。如果名字对不上,Symfony找不到对应的安全token,app.user肯定是null。确保User类实现了正确的接口
你的User类必须实现Symfony\Component\Security\Core\User\UserInterface接口,不然Symfony的安全组件没法正确处理这个用户对象,Twig也就识别不了app.user。
内容的提问来源于stack exchange,提问作者atcCoder

