2011-10-06 10 views
105

Sto usando l'installazione di sicurezza di Symfony. Tutto funziona bene, ma non so come fare una cosa importante:Come si ottiene l'entità che rappresenta l'utente corrente in Symfony2?

In ramoscello, posso raggiungere informazioni dell'utente corrente facendo:

Welcome, {{ app.user.username }} 

o simile

Come faccio accedere a queste stesse informazioni nel Controller? Nello specifico, voglio ottenere l'entità utente corrente in modo che possa memorizzarla in relazione in un'altra entità (mappatura uno a uno).

speravo davvero che sarebbe

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

ma che non funziona. Mi dà una classe di tipo

Symfony\Component\Security\Core\User\User 

e voglio uno di tipo

Acme\AuctionBundle\Entity\User 

che è il mio soggetto ....

+13

[The Symfony libro: Recupero l'oggetto utente] (http://symfony.com/doc/master/book/security.html#retrieving-the-user-object) – Hubro

risposta

167

Come dice ktolis, è necessario prima configurare il proprio /app/config/security.yml.

Poi, con

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

dovrebbe essere enougth!

$ usr è il tuo oggetto utente! Non è necessario interrogarlo di nuovo.

Scopri come impostare i provider in security.yml da Sf2 Documentation e riprova.

Buona fortuna!


EDIT: da symfony 2.6, security.context servizio è deprecato, usare security.token_storage servizio come:

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

Per me $ this-> getUser() funziona anche per ottenere l'oggetto utente. – madc

+0

@madc Nice finding – ChocoDeveloper

+0

Cosa succede se ho bisogno dell'entità utente su un modello PHP? – DomingoSL

-34

Beh, in primo luogo è necessario richiedere il nome utente del l'utente dalla sessione nell'azione del controller in questo modo:

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

quindi eseguire una query sul db e ottenere il tuo oggetto con h dql regolare come

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

il $ utente dovrebbe tenere l'utente con questo nome utente (è possibile utilizzare anche altri settori naturalmente)

... ma si dovrà configurare il tuo primo/app/config/configurazione security.yml utilizzare il campo appropriato per il provider di sicurezza in questo modo:

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

speranza che questo aiuti!

+0

Bene Martin si sia vuole il utente O il nome utente. La scelta è tua. È tua responsabilità procurarti l'oggetto di cui hai bisogno. E come hai detto tu non vuoi l'utente normale ma l'utente dello spazio dei nomi Acme. – ktolis

+5

"SELECT u FROM Acme \ AuctionBundle \ Entity \ User u where u.username =". $ Username; = DOVRESTI USARE QUESTIONI PARAMETRIZZATE! – CappY

+0

'$ this-> get ('security.context') -> getToken() -> getUser()' ottiene automaticamente l'oggetto utente connesso. Non è necessario interrogarlo di nuovo. In effetti, quale versione stavi usando? – Jeet

6

Il filo è un po 'vecchio, ma credo che questo potrebbe probabilmente risparmiare tempo di qualcuno ...

Ho incontrato lo stesso problema come l'originale domanda, che il tipo è mostrato come Symfony \ Component \ Security \ core \ user \ user

E infine scoperto che mi è stato collegato con un utente in memoria

mia security.yml sembra s omething come questo

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

il tipo di utente in_memory è sempre Symfony \ Component \ Security \ Core \ User \ utente, se si vuole utilizzare il proprio ente, accedere utilizzando utente del provider.

Grazie, HJ

49

Best practice

Secondo the documentation dal Symfony 2.1 è sufficiente utilizzare questa scorciatoia:

$user = $this->getUser(); 
È possibile che questo

è ancora lavorando su Symfony 3.2 ed è una scorciatoia per questo:

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

Il servizio security.token_storage è stato introdotto in Symfony 2.6. Prima di Symfony 2.6, è stato necessario utilizzare il metodo getToken() del servizio security.context.

Esempio: E se volete direttamente il nome utente:

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

Se tipo di classe utente errato

L'utente sarà un oggetto e la classe di quell'oggetto dipenderà dalla vostra user provider.

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

Benvenuti in StackOverflow. Si prega di spiegare la risposta. stackoverflow.com/help/how-to-answer –

Problemi correlati