尝试访问用户时,Token为null

时间:2017-07-11 15:29:36

标签: php symfony symfony-3.3

我对Symfony 3中的令牌有一个奇怪的问题。

我将security.token_storage注入我的Twig扩展

app.twig_extension:
     class: AppBundle\Twig\Extension\TwigExtension
     arguments: ['@security.token_storage']
     tags:
         - { name: twig.extension }

现在,在构造函数中,我想从令牌中获取用户。

public function __construct(TokenStorage $tokenStorage)
{
    /** @var User user */
    $token = $tokenStorage->getToken();
    //$user = $token->getUser();
    //dump($user);
    //$this->user = $tokenStorage->getToken()->getUser();
}

这是问题所在。如果我转储$token,一切似乎都正常。这是来自令牌的转储:

PostAuthenticationGuardToken {#637 ▼
  -providerKey: "main"
  -user: User {#396 ▶}
  -roles: array:1 [▶]
  -authenticated: true
  -attributes: []
}

但如果我使用的是$token->getUser();,我会收到一条错误,我在 null

上呼叫getUser
  

(1/1)FatalThrowableError

     

在null

上调用成员函数getUser()

此错误将显示在Symfony分析器中。现在,如果我从代码中删除部件$token->getUser();,然后重新加载探查器,则会显示该用户。

我无法解释这种行为,也不能解释为什么抛出有关 null 变量的错误。有人可以向我解释一下吗?

我已经尝试将整个容器注入服务器并试图让用户通过容器,但结果是一样的。

3 个答案:

答案 0 :(得分:1)

您在Profiler上看到错误的原因是探查器URL不在防火墙后面,因此getToken()没有身份验证信息且为null。

finally { ... }函数的PHPdoc

getToken

确保在致电/** * Returns the current security token. * * @return TokenInterface|null A TokenInterface instance or null if no authentication information is available */ public function getToken();

之前检查身份验证信息是否可用

答案 1 :(得分:0)

我无法解决问题本身,但我找到了一个有效的解决方法。

我没有将TokenStorage注入扩展,而是将用户作为我想要使用的函数的参数。

这是我在我的树枝模板中进行的调用

{{ showUnreadMessages(app.user) }}

我的TwigExtension包含以下功能:

public function getFunctions()
{
    return [
        new \Twig_SimpleFunction('showUnreadMessages', [$this, 'showUnreadMessages'])
    ];
}

public function showUnreadMessages(User $user)
{
    return $this->dbHandler->getCountUnreadMessages($user);
}

答案 2 :(得分:-1)

尝试使用此功能来获取用户

$user = $this->container->get('security.token_storage')->getToken()->getUser();