web-dev-qa-db-fra.com

Comment obtenir l'entité qui représente l'utilisateur actuel dans Symfony2?

J'utilise la configuration de sécurité Symfony. Tout fonctionne bien, mais je ne sais pas comment faire une chose importante:

En twig, je peux accéder aux informations de l'utilisateur actuel en faisant:

Welcome, {{ app.user.username }}

ou similaire

Comment accéder à ces mêmes informations dans le contrôleur? Plus précisément, je souhaite obtenir l'entité utilisateur actuelle afin de pouvoir la stocker de manière relationnelle dans une autre entité (mappage un à un).

J'espérais vraiment que ce serait

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

mais ça ne marche pas. Ça me donne une classe de type

Symfony\Component\Security\Core\User\User

et j'en veux un de type

Acme\AuctionBundle\Entity\User

qui est mon entité ....

123
Robert Martin

Comme le dit ktolis, vous devez d’abord configurer votre /app/config/security.yml.

Puis avec

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

devrait être enougth!

$ usr est votre objet utilisateur! Vous n'avez pas besoin de l'interroger à nouveau.

Trouvez le moyen de configurer vos fournisseurs dans security.yml à partir de Documentation Sf2 et réessayez.

Meilleure chance!


EDIT: à partir de symfony 2.6, le service security.context est obsolète, utilisez le service security.token_storage en tant que:

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

EDIT SF4:

Dans symfony 4 (probablement aussi en 3.3, mais seulement dans 4), vous pouvez injecter le service Security via câblage automatique dans le contrôleur comme ceci:

use Symfony\Component\Security\Core\Security;

public function privatePage( Security $security ) : Response
{
    $user = $security->getUser();
    // ... do whatever you want with $user
}
195
Cristian Douce

Meilleur entrainement

Selon la documentation depuis Symfony 2.1, utilisez simplement ce raccourci:

$user = $this->getUser();

Ce qui précède fonctionne sur Symfony 3.2 et constitue un raccourci pour cela:

$user = $this->get('security.token_storage')->getToken()->getUser();

Le service security.token_storage a été introduit dans Symfony 2.6. Avant Symfony 2.6, vous deviez utiliser la méthode getToken() du service security.context.

Exemple : Et si vous voulez directement le nom d'utilisateur:

$username = $this->getUser()->getUsername();

Si le type de classe d'utilisateur est incorrect

L'utilisateur sera un objet et la classe de cet objet dépendra de votre fournisseur d'utilisateur .

61
Antoine Subit

Le fil est un peu vieux mais je pense que cela pourrait probablement faire gagner du temps à quelqu'un ...

J'ai rencontré le même problème que la question d'origine, à savoir que le type apparaît sous la forme Symfony\Component\Security\Core\User\User

Il s'est finalement avéré que j'étais connecté en utilisant un utilisateur en mémoire

mon security.yml ressemble à quelque chose comme ça

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' ] }

le type d'utilisateur in_memory est toujours Symfony\Component\Security\Core\User\User si vous souhaitez utiliser votre propre entité, connectez-vous à l'aide de l'utilisateur de ce fournisseur.

Merci, hj

6
hj'

Dans symfony> = 3.2, documentation indique que:

Une autre façon d’obtenir l’utilisateur actuel dans un contrôleur est de taper l’argument du contrôleur avec serInterface (et de le définir par défaut sur null si la connexion est facultative):

use Symfony\Component\Security\Core\User\UserInterface\UserInterface;

public function indexAction(UserInterface $user = null)
{
    // $user is null when not logged-in or anon.
}

Ceci n'est recommandé que pour les développeurs expérimentés qui n'utilisent pas le contrôleur de base Symfony et n'utilisent pas le ControllerTrait . Sinon, il est recommandé de continuer à utiliser le raccourci getUser ().

Blog post à ce sujet

3
Nikita U.
$this->container->get('security.token_storage')->getToken()->getUser();
2
Alenko Verzina