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é ....
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
}
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éthodegetToken()
du servicesecurity.context
.
Exemple : Et si vous voulez directement le nom d'utilisateur:
$username = $this->getUser()->getUsername();
L'utilisateur sera un objet et la classe de cet objet dépendra de votre fournisseur d'utilisateur .
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
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
$this->container->get('security.token_storage')->getToken()->getUser();