我正在使用Symfony安全设置。一切都很好,但我不知道如何做一件重要的事情:
在twig中,我可以通过以下方式获取当前用户的信息:
Welcome, {{ app.user.username }}
或类似的
如何在Controller中访问相同的信息?具体来说,我想获取当前用户实体,以便我可以将其关联存储在另一个实体中(一对一映射)。
我真的希望它能
$this->get('security.context')->getToken()->getUser()
但这不起作用。它给了我一类
Symfony\Component\Security\Core\User\User
我想要一个
类型Acme\AuctionBundle\Entity\User
这是我的实体......
答案 0 :(得分:189)
正如ktolis所说,您首先必须配置/app/config/security.yml
。
然后用
$usr= $this->get('security.context')->getToken()->getUser();
$usr->getUsername();
应该是理所当然的!
$ usr 是您的用户对象!您无需再次查询。
从Sf2 Documentation了解如何在security.yml
设置提供商,然后重试。
祝你好运!
编辑,security.context
服务已弃用,请使用security.token_storage
服务:
$this->get('security.token_storage')->getToken()->getUser()
编辑SF4:
在symfony 4中(也可能是3.3,但只在4中进行了实际测试),您可以通过控制器中的 自动接线 注入Security
服务像这样:
use Symfony\Component\Security\Core\Security;
public function privatePage( Security $security ) : Response
{
$user = $security->getUser();
// ... do whatever you want with $user
}
答案 1 :(得分:60)
根据the documentation,因为Symfony 2.1只使用这个快捷方式:
$user = $this->getUser();
以上仍在使用Symfony 3.2 ,并且是此的捷径:
$user = $this->get('security.token_storage')->getToken()->getUser();
Symfony 2.6中引入了
security.token_storage
服务。在Symfony 2.6之前,您必须使用getToken()
服务的security.context
方法。
示例:如果您想直接使用用户名:
$username = $this->getUser()->getUsername();
用户将是一个对象,该对象的类将取决于您的user provider。
答案 2 :(得分:6)
线程有点旧但我认为这可能会节省一些人的时间......
我遇到了与原始问题相同的问题,该类型显示为 的Symfony \组件\安全\核心\用户\用户
最终证明我是使用内存用户登录的
我的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
答案 3 :(得分:3)
在symfony> = 3.2中,documentation表示:
在控制器中获取当前用户的另一种方法是 type-hint控制器参数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关于它
答案 4 :(得分:2)
$this->container->get('security.token_storage')->getToken()->getUser();
答案 5 :(得分:-35)
首先,您需要在控制器操作中从会话中请求用户的用户名,如下所示:
$username=$this->get('security.context')->getToken()->getUser()->getUserName();
然后对db进行查询并使用常规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}
希望这有帮助!