Symfony2'de geçerli kullanıcıyı temsil eden varlığı nasıl edinebilirim?


136

Symfony güvenlik kurulumunu kullanıyorum. Her şey yolunda gidiyor ama önemli bir şeyi nasıl yapacağımı bilmiyorum:

Dalda, şu anki kullanıcının bilgilerine şunu yaparak ulaşabilirim:

Welcome, {{ app.user.username }}

veya benzeri

Denetleyiciden aynı bilgilere nasıl erişebilirim? Özellikle, geçerli kullanıcı varlık almak istiyorum, böylece ilişkisel olarak başka bir varlık (bire bir eşleme) saklayabilirsiniz.

Gerçekten olmasını umuyordum

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

ama bu işe yaramıyor. Bana bir tür sınıf veriyor

Symfony\Component\Security\Core\User\User

ve türünü istiyorum

Acme\AuctionBundle\Entity\User

ki bu benim varlığım ....


Yanıtlar:


209

Symfony 4+, 2019+ Yaklaşımı

Symfony 4'te (muhtemelen 3.3 de, ancak sadece 4'te gerçek test) , kontrol cihazındaki otomatik kablolama ileSecurity hizmeti aşağıdaki gibi enjekte edebilirsiniz :

<?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- Yaklaşım

@Ktolis'in dediği gibi, önce yapılandırmanız gerekir /app/config/security.yml.

Sonra ile

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

yeterli olmalı!

$userKullanıcı Nesneniz! Tekrar sorgulamanıza gerek yoktur.

İçinde sağlayıcıları kurmak için çıkış yolu bulun security.ymlgelen Sf2 Dokümantasyon ve tekrar deneyin.

İyi şanslar!


Bir PHP şablonunda kullanıcı varlığına ihtiyacım olursa ne olur?
DomingoSL

@DomingoSL Resmi belgelerden aşağıdaki bağlantıyı kontrol edin: symfony.com/doc/master/book/…
Cristian Douce

5
Symfony 2.6'dan bu yana, security.context hizmeti kullanımdan kaldırıldı ve iki yeni hizmete ayrıldı: security.authorization_checker ve security.token_storage. Geçerli kullanıcıyı buradan getirmenin doğru yolunu buradan kontrol edebilirsiniz: symfony.com/blog/…
jmleroux

Ben Symfony 5.1.2 ve kulüpler $user = $this->security->getUser();, $userher zaman nulliçinde veya olmasın açmış olsun, benim için.
Nick Rolando

Oh gibi görünüyor çünkü bunu bir Etkinlik Abonesinde yapıyorum ve bu henüz istekte bu erken başlatılmadı.
Nick Rolando

62

En iyi pratik

Symfony 2.1'den bu yana belgelere göre bu kısayolu kullanın:

$user = $this->getUser();

Yukarıdaki Symfony 3.2 üzerinde hala çalışıyor ve bunun için bir kısayol:

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

security.token_storageHizmet Symfony 2.6 kullanılmaya başlandı. Symfony 2.6'dan önce hizmet getToken()yöntemini kullanmak zorundaydınız security.context.

Örnek : Ve doğrudan kullanıcı adını istiyorsanız:

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

Yanlış kullanıcı sınıfı türü

Kullanıcı bir nesne olacak ve bu nesnenin sınıfı kullanıcı sağlayıcınıza bağlı olacaktır .


6

İş parçacığı biraz eski ama bu muhtemelen birinin zaman kazandırabilir düşünüyorum ...

Orijinal soru ile aynı sorunla karşılaştım, türün Symfony \ Component \ Security \ Core \ User \ User olarak gösterildi

Sonunda bir bellek kullanıcısı kullanarak giriş yaptığım ortaya çıktı

benim security.yml böyle bir şeye benziyor

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

kendi varlığınızı kullanmak istiyorsanız, in_memory kullanıcı türü her zaman Symfony \ Component \ Security \ Core \ User \ User olur, bu sağlayıcının kullanıcısını kullanarak oturum açın.

Teşekkürler, hj


4

Symfony> = 3.2'de belgeler şunları belirtir:

Geçerli kullanıcıyı bir denetleyiciye almanın alternatif bir yolu, denetleyici bağımsız değişkenini UserInterface ile yazmaktır (ve oturum açmışsa isteğe bağlı olarak null olarak ayarlanır ):

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

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

Bu yalnızca Symfony temel denetleyiciden uzatmayan ve ControllerTrait'ı kullanmayan deneyimli geliştiriciler için önerilir . Aksi takdirde, getUser () kısayolunu kullanmaya devam etmeniz önerilir.

Bununla ilgili blog yayını


Bu bir EventSubscriber geçerli kullanıcı almaya çalışırken bana çok yardımcı oldu: i __construct param olarak autowire (Güvenlik $ güvenlik) sonra $ security-> getUser () ve voilà kullanın!
tsadiq

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

2
Stackoverflow'a hoş geldiniz. Lütfen cevap hakkında açıklayınız. stackoverflow.com/help/how-to-answer
Rohan Khude

-36

Öncelikle, denetleyici eyleminizdeki oturumdan kullanıcının kullanıcı adını şu şekilde istemeniz gerekir:

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

sonra db için bir sorgu yapmak ve gibi normal dql ile nesne almak

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

$ kullanıcısı artık kullanıcıyı bu kullanıcı adıyla tutmalıdır (elbette başka alanları da kullanabilirsiniz)

... ancak öncelikle /app/config/security.yml yapılandırmanızı güvenlik sağlayıcınız için uygun alanı kullanacak şekilde yapılandırmanız gerekir:

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

Bu yardımcı olur umarım!


Peki Martin ya kullanıcı VEYA kullanıcı adını istiyorum. Seçim senin. İhtiyacınız olan nesneyi almak sizin sorumluluğunuzdadır. Ve dediğin gibi normal kullanıcıyı değil Acme ad alanı kullanıcısını istiyorsun.
ktolis

6
"U seçin Acme \ AuctionBundle \ Entity \ User u burada u.username =". $ Username; = PARAMETRİZE EDİLEN SORGULARI KULLANMALISINIZ!
CappY

1
$this->get('security.context')->getToken()->getUser()kendisi giriş yapmış kullanıcı nesnesini alır. Tekrar sorgulamak zorunda değilsiniz. Aslında hangi sürümü kullanıyordunuz?
Jeet
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.