How do I get the entity that represents the current user in Symfony2?
Entity FrameworkSecuritySymfonyEntity Framework Problem Overview
I am using the Symfony security setup. Everything works fine, but I don't know how to do one important thing:
In twig, I can reach the current user's info by doing:
Welcome, {{ app.user.username }}
or similar
How do I access this same information in the Controller? Specifically, I want to get the current user entity so I can store it relationally in another entity (one-to-one mapping).
I was really hoping it'd be
$this->get('security.context')->getToken()->getUser()
but that doesn't work. It gives me a class of type
Symfony\Component\Security\Core\User\User
and I want one of type
Acme\AuctionBundle\Entity\User
which is my entity....
Entity Framework Solutions
Solution 1 - Entity Framework
Symfony 4+, 2019+ Approach
In symfony 4 (probably 3.3 also, but only real-tested in 4) you can inject the Security
service via auto-wiring in the controller like this:
<?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- Approach
As @ktolis says, you first have to configure your /app/config/security.yml
.
Then with
$user = $this->get('security.token_storage')->getToken()->getUser();
$user->getUsername();
should be enougth!
$user
is your User Object! You don't need to query it again.
Find out the way to set up your providers in security.yml
from Sf2 Documentation and try again.
Best luck!
Solution 2 - Entity Framework
Best practice
According to the documentation since Symfony 2.1 simply use this shortcut :
$user = $this->getUser();
The above is still working on Symfony 3.2 and is a shortcut for this :
$user = $this->get('security.token_storage')->getToken()->getUser();
> The security.token_storage
service was introduced in Symfony 2.6. Prior to Symfony 2.6, you had to use the getToken()
method of the security.context
service.
Example : And if you want directly the username :
$username = $this->getUser()->getUsername();
The user will be an object and the class of that object will depend on your If wrong user class typeuser provider.
Solution 3 - Entity Framework
The thread is a bit old but i think this could probably save someone's time ...
I ran into the same problem as the original question, that the type is showed as Symfony\Component\Security\Core\User\User
It eventually turned out that i was logged in using an in memory user
my security.yml looks something like this
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' ] }
the in_memory user type is always Symfony\Component\Security\Core\User\User if you want to use your own entity, log in using that provider's user.
Thanks, hj
Solution 4 - Entity Framework
In symfony >= 3.2, documentation states that:
> An alternative way to get the current user in a controller is to
> type-hint the controller argument with UserInterface (and default it
> to null if being logged-in is optional):
>
> use Symfony\Component\Security\Core\User\UserInterface\UserInterface;
>
> public function indexAction(UserInterface $user = null)
> {
> // $user is null when not logged-in or anon.
> }
>
> This is only recommended for experienced developers who don't extend
> from the Symfony base controller and don't use the ControllerTrait
> either. Otherwise, it's recommended to keep using the getUser()
> shortcut.
Blog post about it
Solution 5 - Entity Framework
In Symfony version >= 5 and PHP >= 8.0 you can type hint the authenticated user using Attributes, only in controllers though:
public function indexAction(#[CurrentUser] User $user): Response
{
// do something
}
Solution 6 - Entity Framework
$this->container->get('security.token_storage')->getToken()->getUser();
Solution 7 - Entity Framework
Well, first you need to request the username of the user from the session in your controller action like this:
$username=$this->get('security.context')->getToken()->getUser()->getUserName();
then do a query to the db and get your object with regular dql like
$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();
the $user should now hold the user with this username ( you could also use other fields of course)
...but you will have to first configure your /app/config/security.yml configuration to use the appropriate field for your security provider like so:
security:
provider:
example:
entity: {class Acme\AuctionBundle\Entity\User, property: username}
hope this helps!