2011-10-06 22 views
105

Estoy usando la configuración de seguridad de Symfony. Todo funciona bien, pero no sé cómo hacer una cosa importante:¿Cómo obtengo la entidad que representa al usuario actual en Symfony2?

En ramita, que puede llegar a información del usuario actual haciendo:

Welcome, {{ app.user.username }} 

o similares

¿Cómo puedo acceder a esta misma información en el controlador? Específicamente, quiero obtener la entidad de usuario actual para poder almacenarla relacionalmente en otra entidad (mapeo de uno a uno).

Me esperaba que sería

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

pero eso no funciona. Me da una clase de tipo

Symfony\Component\Security\Core\User\User 

y yo quiero uno de tipo

Acme\AuctionBundle\Entity\User 

que es mi entidad ....

+13

[El libro de Symfony: Recuperando el objeto de usuario] (http://symfony.com/doc/master/book/security.html#retrieving-the-user-object) – Hubro

Respuesta

167

Como dice ktolis, primero debe configurar su /app/config/security.yml.

Luego, con

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

debe ser enougth!

$ usr es su objeto de usuario! No necesita volver a consultarlo.

Descubre la manera de configurar tus proveedores en security.yml desde Sf2 Documentation y vuelve a intentarlo.

¡Mejor suerte!


EDIT: de Symfony 2.6, security.context servicio está obsoleta, utilice security.token_storage servicio como:

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

Para mí, $ this-> getUser() también funciona para obtener el objeto de usuario. – madc

+0

@madc Nice finding – ChocoDeveloper

+0

¿Qué sucede si necesito la entidad de usuario en una plantilla de PHP? – DomingoSL

-34

Bueno, primero que hay que solicitar el nombre de usuario de la usuario de la sesión en su acción de controlador de esta manera:

$username=$this->get('security.context')->getToken()->getUser()->getUserName(); 

luego haga una consulta al DB y obtenga su objeto ingenio h DQL regular como

$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(); 

el usuario $ ahora debe sostener el usuario con este nombre de usuario (también se puede usar otros campos de golf)

... pero usted tendrá que configurar su primera/app/config/security.yml utilizar el campo apropiado para su proveedor de seguridad de este modo:

security: 
provider: 
    example: 
    entity: {class Acme\AuctionBundle\Entity\User, property: username} 

esperanza que esto ayude!

+0

Bueno Martin que o bien quieren que el usuario O el nombre de usuario. La decisión es tuya. Es su responsabilidad obtener el objeto que necesita. Y como dijiste, no deseas el usuario normal sino el usuario del espacio de nombres de Acme. – ktolis

+5

"SELECCIONAR DE ACME \ AuctionBundle \ Entity \ User u where u.username =". $ Username; = ¡USTED DEBE UTILIZAR CONSULTAS PARÁMETRIZADAS! – CappY

+0

'$ this-> get ('security.context') -> getToken() -> getUser()' recibe el objeto de usuario conectado. No tiene que volver a consultarlo. De hecho, ¿qué versión usabas? – Jeet

6

El hilo es un poco viejo, pero creo que esto probablemente podría ahorrar tiempo de alguien ...

me encontré con el mismo problema que el original cuestión, que el tipo se mostró como Symfony \ Component \ Security \ Core \ usuario \ usuario

Con el tiempo, resultó que estaba iniciado sesión con una memoria de usuario en

mi security.yml ve s omething como esto

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

el tipo de usuario es siempre in_memory Symfony \ Component \ Security \ Core \ Usuario \ usuario si desea utilizar su propia entidad, iniciar sesión con el usuario de ese proveedor.

Gracias, hj

49

La mejor práctica

Según the documentation desde Symfony 2.1 simplemente utilice este atajo:

$user = $this->getUser(); 

Lo anterior se sigue trabajando en Symfony 3.2 y es un atajo para esto:

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

El servicio security.token_storage se introdujo en Symfony 2.6. Antes de Symfony 2.6, tenía que usar el método getToken() del servicio security.context.

Ejemplo: Y si quieres directamente el nombre de usuario:

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

Si el tipo de clase de usuario incorrecto

El usuario será un objeto y la clase de ese objeto dependerá de su user provider.

2
$this->container->get('security.token_storage')->getToken()->getUser(); 
+0

Bienvenido a stackoverflow. Por favor explique sobre la respuesta. stackoverflow.com/help/how-to-answer –

Cuestiones relacionadas