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

问题描述 投票:0回答:7

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

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

Welcome, {{ app.user.username }}

或类似

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

我真的希望会这样

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

但这行不通。它给了我一个类型

Symfony\Component\Security\Core\User\User

我想要其中一种类型

Acme\AuctionBundle\Entity\User

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

entity-framework security symfony
7个回答
248
投票

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文档

中的
security.yml中找到设置提供商的方法,然后重试。

祝你好运!


69
投票
最佳实践

根据

文档,自 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 之前,您必须使用 
getToken()
 服务的 
security.context
 方法。

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

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

是否错误的用户类类型

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

用户提供者


7
投票
在 Symfony 版本 >= 5 和 PHP >= 8.0 中,您可以使用属性键入提示经过身份验证的用户,但仅在控制器中:

public function indexAction(#[CurrentUser] User $user): Response { // do something }
    

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

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

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

我的security.ym看起来像这样

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 如果您想使用自己的实体,请使用该提供商的用户登录。

谢谢, 哈杰


6
投票
文档

指出:

在控制器中获取当前用户的另一种方法是 使用
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 基本控制器

并且不要使用 ControllerTrait 任何一个。否则,建议继续使用 getUser() 快捷方式。

博客文章

关于它


2
投票


-39
投票

$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}

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.