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.