Rob*_*tin 125 security entity-framework symfony
我正在使用Symfony安全设置.一切正常,但我不知道如何做一件重要的事情:
在twig中,我可以通过以下方式获取当前用户的信息:
Welcome, {{ app.user.username }}
Run Code Online (Sandbox Code Playgroud)
或类似的
如何在Controller中访问相同的信息?具体来说,我想获取当前用户实体,以便我可以将其关联存储在另一个实体中(一对一映射).
我真的希望它会
$this->get('security.context')->getToken()->getUser()
Run Code Online (Sandbox Code Playgroud)
但这不起作用.它给了我一类的类型
Symfony\Component\Security\Core\User\User
Run Code Online (Sandbox Code Playgroud)
我想要一个类型
Acme\AuctionBundle\Entity\User
Run Code Online (Sandbox Code Playgroud)
这是我的实体....
Cri*_*uce 197
正如ktolis所说,你首先必须配置你的/app/config/security.yml
.
然后用
$usr= $this->get('security.context')->getToken()->getUser();
$usr->getUsername();
Run Code Online (Sandbox Code Playgroud)
应该是恩!
$ usr是您的用户对象!您无需再次查询.
security.yml
从Sf2文档中找出设置提供程序的方法,然后重试.
好运!
编辑:从symfony 2.6,security.context
服务被弃用,使用security.token_storage
服务为:
$this->get('security.token_storage')->getToken()->getUser()
Run Code Online (Sandbox Code Playgroud)
Ant*_*bit 62
根据Symfony 2.1以来的文档,只需使用此快捷方式:
$user = $this->getUser();
Run Code Online (Sandbox Code Playgroud)
以上仍然在Symfony 3.2上工作,并且是这个的捷径:
$user = $this->get('security.token_storage')->getToken()->getUser();
Run Code Online (Sandbox Code Playgroud)
该
security.token_storage
服务是在Symfony 2.6中引入的.在Symfony 2.6之前,您必须使用getToken()
该security.context
服务的方法.
示例:如果您想直接使用用户名:
$username = $this->getUser()->getUsername();
Run Code Online (Sandbox Code Playgroud)
用户将是一个对象,该对象的类将取决于您的用户提供者.
在 Symfony 版本 >= 5 和 PHP >= 8.0 中,您可以使用属性键入提示经过身份验证的用户,但只能在控制器中:
public function indexAction(#[CurrentUser] User $user): Response
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
小智 6
线程有点旧,但我认为这可能会节省一些人的时间......
我遇到了与原始问题相同的问题,该类型显示为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' ] }
Run Code Online (Sandbox Code Playgroud)
如果要使用自己的实体,则使用该提供程序的用户登录,in_memory用户类型始终为Symfony\Component\Security\Core\User\User.
谢谢,hj
在 symfony >= 3.2 中,文档指出:
在控制器中获取当前用户的另一种方法是使用UserInterface类型提示控制器参数(如果登录是可选的,则默认为 null):
Run Code Online (Sandbox Code Playgroud)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() 快捷方式。
关于它的博客文章