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

时间:2011-10-06 21:52:40

标签: entity-framework security symfony

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

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

Welcome, {{ app.user.username }}

或类似的

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

我真的希望它能

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

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

Symfony\Component\Security\Core\User\User

我想要一个

类型
Acme\AuctionBundle\Entity\User

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

6 个答案:

答案 0 :(得分:189)

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

然后用

$usr= $this->get('security.context')->getToken()->getUser();
$usr->getUsername();

应该是理所当然的!

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

Sf2 Documentation了解如何在security.yml设置提供商,然后重试。

祝你好运!


来自symfony 2.6的

编辑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}

希望这有帮助!