如何在 Symfony2 中获取代表当前用户的实体?

Posted

技术标签:

【中文标题】如何在 Symfony2 中获取代表当前用户的实体?【英文标题】:How do I get the entity that represents the current user in Symfony2? 【发布时间】:2011-12-02 14:44:45 【问题描述】:

我正在使用 Symfony 安全设置。一切正常,但我不知道如何做一件重要的事情:

在 twig 中,我可以通过以下方式获取当前用户的信息:

Welcome,  app.user.username 

或类似

如何在 Controller 中访问相同的信息?具体来说,我想获取当前用户实体,以便我可以将其以关系方式存储在另一个实体中(一对一映射)。

我真的希望是这样的

$this->get('security.context')->getToken()->getUser()

但这不起作用。它给了我一个类型的类

Symfony\Component\Security\Core\User\User

我想要一种类型

Acme\AuctionBundle\Entity\User

这是我的实体......

【问题讨论】:

The Symfony Book: Retrieving the user object 【参考方案1】:

首先,您需要在控制器操作中从会话中请求用户的用户名,如下所示:

$username=$this->get('security.context')->getToken()->getUser()->getUserName();

然后对数据库进行查询并使用常规 dql 获取您的对象

$em = $this->get('doctrine.orm.entity_manager');    
"SELECT u FROM Acme\AuctionBundle\Entity\User u where u.username=".$username;
$q=$em->createQuery($query);
$user=$q->getResult();

$user 现在应该使用这个用户名来保存用户(当然你也可以使用其他字段)

...但是您必须首先配置您的 /app/config/security.yml 配置,以便为您的安全提供程序使用适当的字段,如下所示:

security:
 provider:
  example:
   entity: class Acme\AuctionBundle\Entity\User, property: username

希望这会有所帮助!

【讨论】:

好吧,马丁,您要么想要用户,要么想要用户名。这是你的选择。获得所需的对象是您的责任。正如你所说,你不想要普通用户,而是 Acme 命名空间用户。 "从 Acme\AuctionBundle\Entity\User 中选择你,其中 u.username=".$username; = 你应该使用参数化查询! $this->get('security.context')->getToken()->getUser() 本身会为您获取登录的用户对象。您不必再次查询它。实际上,您使用的是哪个版本?【参考方案2】:

Symfony 4+,2019+ 方法

在 symfony 4(也可能是 3.3,但仅在 4 中经过实际测试)中,您可以像这样在控制器中通过 auto-wiring 注入 Security 服务:

<?php

use Symfony\Component\Security\Core\Security;

class SomeClass

    /**
     * @var Security
     */
    private $security;

    public function __construct(Security $security)
    
       $this->security = $security;
    

    public function privatePage() : Response
    
        $user = $this->security->getUser(); // null or UserInterface, if logged in
        // ... do whatever you want with $user
    


Symfony 2- 方法

正如@ktolis 所说,您首先必须配置您的/app/config/security.yml

然后用

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

应该够了!

$user 是您的用户对象!无需再次查询。

从Sf2 Documentation 找出在security.yml 中设置您的提供程序的方法,然后重试。

祝你好运!

【讨论】:

如果我需要 PHP 模板上的用户实体怎么办? @DomingoSL 查看官方文档中的以下链接:symfony.com/doc/master/book/… 自 Symfony 2.6 以来,security.context 服务已被弃用,并被拆分为两个新服务:security.authorization_checker 和 security.token_storage。您可以在此处检查获取当前用户的正确方法:symfony.com/blog/… 我在 Symfony 5.1.2 和 $user = $this-&gt;security-&gt;getUser(); 上,$user 对我来说始终是 null,无论是否登录。 哦,好像是因为我在事件订阅者中执行此操作,而这还没有在请求的早期初始化。【参考方案3】:

线程有点旧,但我认为这可能会节省某人的时间......

我遇到了与原始问题相同的问题,类型显示为 Symfony\Component\Security\Core\User\User

最终证明我是使用内存用户登录的

我的 security.yml 看起来像这样

security:
    providers:
        chain_provider:
            chain:
                providers: [in_memory, fos_userbundle]
        fos_userbundle:
            id: fos_user.user_manager
        in_memory:
            memory:
                users:
                    user:   password: userpass, roles: [ 'ROLE_USER' ] 
                    admin:  password: adminpass, roles: [ 'ROLE_ADMIN', 'ROLE_SONATA_ADMIN' ] 

in_memory 用户类型始终为 Symfony\Component\Security\Core\User\User 如果您想使用自己的实体,请使用该提供者的用户登录。

谢谢, hj

【讨论】:

【参考方案4】:

最佳实践

根据the documentation,因为 Symfony 2.1 只需使用这个快捷方式:

$user = $this->getUser();

以上内容仍然在 Symfony 3.2 上工作,这是一个捷径:

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

security.token_storage 服务是在 Symfony 2.6 中引入的。在 Symfony 2.6 之前,您必须使用 security.context 服务的 getToken() 方法。

示例:如果您直接想要用户名:

$username = $this->getUser()->getUsername();

如果用户类类型错误

用户将是一个对象,该对象的类将取决于您的user provider。

【讨论】:

【参考方案5】:
$this->container->get('security.token_storage')->getToken()->getUser();

【讨论】:

欢迎来到***。请解释一下答案。 ***.com/help/how-to-answer 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。【参考方案6】:

在 symfony >= 3.2 中,documentation 声明:

在控制器中获取当前用户的另一种方法是 使用UserInterface 类型提示控制器参数(默认为 如果登录是可选的,则为 null):

use Symfony\Component\Security\Core\User\UserInterface\UserInterface;

public function indexAction(UserInterface $user = null)

    // $user is null when not logged-in or anon.

这仅推荐给不扩展的有经验的开发人员 来自Symfony base controller,不要使用ControllerTrait 任何一个。否则,建议继续使用 getUser() 快捷方式。

Blog post关于它

【讨论】:

这对我在 EventSubscriber 中获取当前用户帮助很大:我必须在 __construct 中将 (Security $security) 自动装配为参数,然后使用 $security->getUser() 和瞧!跨度> 【参考方案7】:

在 Symfony 版本 >= 5 和 PHP >= 8.0 中,您可以使用 Attributes 键入提示经过身份验证的用户,但只能在控制器中:

public function indexAction(#[CurrentUser] User $user): Response

     // do something

【讨论】:

以上是关于如何在 Symfony2 中获取代表当前用户的实体?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2:获取持久化对象的 id

Symfony2:如何获取标记有“编辑”ACL 权限的一种类型的所有实体?

Symfony 2 从实体管理器获取实体的原始数据

Symfony 2.0 在实体内部获取服务

Symfony2:如何使用非默认实体管理器对用户进行身份验证?

Symfony2 KnpPaginator bundle 从多个实体获取数据并在一个网格/分页中呈现