如何在 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->security->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:如何获取标记有“编辑”ACL 权限的一种类型的所有实体?