我正在使用 Symfony 安全设置。一切正常,但我不知道如何做一件重要的事情:
在 twig 中,我可以通过以下方式获取当前用户的信息:
Welcome, {{ app.user.username }}
或类似
如何在控制器中访问相同的信息?具体来说,我想获取当前用户实体,以便可以将其关联存储在另一个实体中(一对一映射)。
我真的希望会这样
$this->get('security.context')->getToken()->getUser()
但这行不通。它给了我一个类型
Symfony\Component\Security\Core\User\User
我想要其中一种类型
Acme\AuctionBundle\Entity\User
这是我的实体......
在 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
}
}
正如@ktolis所说,你首先必须配置你的
/app/config/security.yml
。
然后与
$user = $this->get('security.token_storage')->getToken()->getUser();
$user->getUsername();
应该够了!
$user
是您的用户对象!您不需要再次查询。
从Sf2文档
中的
security.yml
中找到设置提供商的方法,然后重试。
祝你好运!
文档,自 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();
是否错误的用户类类型
用户提供者。
public function indexAction(#[CurrentUser] User $user): Response
{
// do something
}
我遇到了与原始问题相同的问题,类型显示为 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 如果您想使用自己的实体,请使用该提供商的用户登录。
谢谢, 哈杰
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() 快捷方式。
$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}
希望这有帮助!