Symfony2 服务构造函数中的 getUser

Posted

技术标签:

【中文标题】Symfony2 服务构造函数中的 getUser【英文标题】:getUser in Symfony2's service constructor 【发布时间】:2014-03-01 15:59:40 【问题描述】:

我的 Symfony2 服务中有一个非常奇怪的问题。 我想在我的服务的构造函数中获取当前用户,但 SecurityContext->getToken 返回 false!

那是我的服务构造函数:

public function __construct(Registry $doctrine, SecurityContext $context)
    $this->doctrine = $doctrine;
    $this->context = $context;
    if(!$this->context->getToken())
        echo "Il y a une merde au niveau du token !";
    
    $this->my_auth = $this->getMyAuth();

这里是我的 service.yml 中的服务声明

security.autorisation:
    class: Nsi\SecurityBundle\Service\Autorisation
    arguments: [@doctrine,@security.context]

但是当我进入我的管理页面时,会出现“Il y a une merde au niveau du Token”消息。 最令人惊讶的是,我底部的 symfony 工具栏显示了我的登录信息!

我的项目是 Symfony 2.3.11 项目

想你的帮助

【问题讨论】:

在上下文中尝试 isGranted() ! 先缓存securityContext,需要时调用getToken()->getUser() (***.com/questions/18770467/…) 我需要在使用用户信息的构造函数中执行查询。在我的情况下,如何将缓存系统用于安全上下文? 为什么需要在服务构造函数中运行任何相关的查询令牌?你能澄清你的问题吗? 我已经尝试过您的解决方案,它可以工作,但没有完全优化。我在一个页面中多次使用此服务,因此为了优化数据库连接,我认为最好的解决方案是在构造函数中获取我的信息并将它们放在一个属性中,以便在我多次调用的函数中获取它。 【参考方案1】:

不要从服务构造函数调用它,因为服务初始化调用早于身份验证。这就是你没有设置令牌的原因。

【讨论】:

【参考方案2】:

试试:

public function __construct(Registry $doctrine, SecurityContext $context)
    $this->doctrine = $doctrine;
    $this->context = $context;
    if(!$this->context->isGranted('ROLE_USER')))
       echo "Il y a une merde au niveau du token !";
    
    $this->my_auth = $this->getMyAuth();

【讨论】:

不工作。我有这个错误:AuthenticationCredentialsNotFoundException:安全上下文不包含身份验证令牌。一个可能的原因可能是没有为此 URL 配置防火墙。

以上是关于Symfony2 服务构造函数中的 getUser的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 服务容器 - 将普通参数传递给服务构造函数

扩展类时的构造函数注入

Symfony2 覆盖 Sonata 媒体图像提供程序。(将接口传递给构造函数)

Symfony2 获取登录用户

Symfony 2,未定义的变量,在构造函数中初始化为 ArrayCollection 的受保护成员通过错误,它是未定义的

Symfony2 从服务发送电子邮件