मैं उस इकाई को कैसे प्राप्त कर सकता हूं जो Symfony2 में वर्तमान उपयोगकर्ता का प्रतिनिधित्व करता है?


136

मैं सिम्फनी सुरक्षा सेटअप का उपयोग कर रहा हूं। सब कुछ ठीक काम करता है, लेकिन मुझे नहीं पता कि एक महत्वपूर्ण काम कैसे करें:

टहनी में, मैं वर्तमान उपयोगकर्ता की जानकारी तक पहुँच सकता हूँ:

Welcome, {{ app.user.username }}

या इसी के समान

मैं इसी जानकारी को कंट्रोलर में कैसे एक्सेस कर सकता हूं? विशेष रूप से, मैं वर्तमान उपयोगकर्ता इकाई प्राप्त करना चाहता हूं ताकि मैं इसे अन्य इकाई (एक-से-एक मैपिंग) में तर्कसंगत रूप से संग्रहीत कर सकूं।

मैं वास्तव में उम्मीद कर रहा था कि यह होगा

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

लेकिन वह काम नहीं करता है। यह मुझे एक प्रकार का वर्ग देता है

Symfony\Component\Security\Core\User\User

और मुझे एक प्रकार का चाहिए

Acme\AuctionBundle\Entity\User

जो मेरी इकाई है ...।


जवाबों:


209

सिम्फनी 4+, 2019+ दृष्टिकोण

सिम्फनी 4 में (शायद 3.3 भी, लेकिन केवल 4 में वास्तविक-परीक्षण किया गया है) आप इस पर नियंत्रक में ऑटो-वायरिंग केSecurity माध्यम से सेवा को इंजेक्ट कर सकते हैं :

<?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
    }
}

सिम्फनी 2- दृष्टिकोण

जैसा कि @ktolis कहते हैं, आपको सबसे पहले अपने कॉन्फ़िगर करना होगा /app/config/security.yml

फिर साथ में

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

उत्साह होना चाहिए!

$userआपका उपयोगकर्ता ऑब्जेक्ट है! आपको इसे फिर से क्वेरी करने की आवश्यकता नहीं है।

Sf2 दस्तावेज़ीकरणsecurity.yml से अपने प्रदाताओं को सेट करने का तरीका जानें और पुनः प्रयास करें।

अच्छी किस्मत!


क्या होगा अगर मुझे PHP टेम्पलेट पर उपयोगकर्ता इकाई की आवश्यकता है?
डोमिंगोसेल

@DomingoSL आधिकारिक दस्तावेज से निम्नलिखित लिंक की जाँच करें: symfony.com/doc/master/book/…
Cristian Douce

5
सिम्फनी 2.6 के बाद से, Security.context सेवा को हटा दिया गया है और इसे दो नई सेवाओं में विभाजित किया गया है: security.authorization_checker और security.token_storage। आप वर्तमान उपयोगकर्ता को यहां लाने का सही तरीका देख सकते हैं: symfony.com/blog/…
jmleroux

मैं Symfony 5.1.2 पर और पर हूँ $user = $this->security->getUser();, $userहमेशा होता है nullकि क्या में हो या ना किया, मेरे लिए।
निक रोलांडो

ओह ऐसा लगता है क्योंकि मैं एक इवेंट सबस्क्राइबर में ऐसा कर रहा हूं, और यह अभी इस अनुरोध में प्रारंभिक नहीं है।
निक रोलांडो

62

सर्वश्रेष्ठ प्रणालियां

सिम्फनी 2.1 के बाद से प्रलेखन के अनुसार बस इस शॉर्टकट का उपयोग करें:

$user = $this->getUser();

उपरोक्त अभी भी सिम्फनी 3.2 पर काम कर रहा है और इसके लिए एक शॉर्टकट है:

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

security.token_storageसेवा Symfony 2.6 में पेश किया गया था। सिम्फनी 2.6 से पहले, आपको सेवा की getToken()विधि का उपयोग करना था security.context

उदाहरण : और यदि आप सीधे उपयोगकर्ता नाम चाहते हैं:

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

यदि गलत उपयोगकर्ता वर्ग प्रकार

उपयोगकर्ता एक ऑब्जेक्ट होगा और उस ऑब्जेक्ट का वर्ग आपके उपयोगकर्ता प्रदाता पर निर्भर करेगा ।


6

धागा थोड़ा पुराना है लेकिन मुझे लगता है कि इससे किसी का समय बच सकता है ...

मैं मूल प्रश्न के रूप में एक ही समस्या में भाग गया, कि इस प्रकार को Symfony \ Component \ Security \ Core \ User \ User के रूप में दिखाया गया है

यह अंततः पता चला कि मैं स्मृति उपयोगकर्ता में एक का उपयोग कर लॉग इन किया गया था

मेरी सुरक्षा। कुछ इस तरह दिखता है

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

in_memory उपयोगकर्ता प्रकार हमेशा Symfony \ Component \ Security \ Core \ User \ User होता है यदि आप अपनी स्वयं की इकाई का उपयोग करना चाहते हैं, तो उस प्रदाता के उपयोगकर्ता का उपयोग करके लॉग इन करें।

धन्यवाद, hj


4

सिम्फनी में = = 3.2, प्रलेखन में कहा गया है कि:

एक नियंत्रक में वर्तमान उपयोगकर्ता को प्राप्त करने का एक वैकल्पिक तरीका UserInterface के साथ नियंत्रक तर्क को टाइप करना है (और लॉग-इन होने पर वैकल्पिक होने के लिए इसे डिफ़ॉल्ट रूप से डिफ़ॉल्ट करना वैकल्पिक है):

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

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

यह केवल अनुभवी डेवलपर्स के लिए अनुशंसित है जो सिम्फनी बेस कंट्रोलर से विस्तारित नहीं होते हैं और कंट्रोलरट्रेट का उपयोग नहीं करते हैं। अन्यथा, getUser () शॉर्टकट का उपयोग करने की अनुशंसा की जाती है।

इसके बारे में ब्लॉग पोस्ट


एक EventSubscriber में वर्तमान उपयोगकर्ता प्राप्त करने की कोशिश करते समय इससे मुझे बहुत मदद मिली: मुझे __construct में param के रूप में (सुरक्षा $ सुरक्षा) प्राप्त करना था, फिर $ सुरक्षा का उपयोग करें-> getUser () और voilà!
tsadiq


-36

ठीक है, पहले आपको अपने नियंत्रक क्रिया में सत्र से उपयोगकर्ता के उपयोगकर्ता नाम का अनुरोध करने की आवश्यकता है:

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

इसके बाद db को एक क्वेरी करें और नियमित dql जैसी अपनी वस्तु प्राप्त करें

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

$ उपयोगकर्ता को अब इस उपयोगकर्ता नाम के साथ उपयोगकर्ता रखना चाहिए (आप अन्य क्षेत्रों का भी उपयोग कर सकते हैं)

... लेकिन आपको अपने सुरक्षा प्रदाता के लिए उपयुक्त फ़ील्ड का उपयोग करने के लिए सबसे पहले अपने /app/config/security.yml कॉन्फ़िगरेशन को कॉन्फ़िगर करना होगा:

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

उम्मीद है की यह मदद करेगा!


खैर मार्टिन आप या तो उपयोगकर्ता या उपयोगकर्ता नाम चाहते हैं। चुनना आपको है। यह आपकी जिम्मेदारी है कि आपको जिस वस्तु की आवश्यकता है उसे प्राप्त करें। और जैसा कि आपने कहा था कि आप रेगुलर यूजर नहीं बल्कि एक्मे नेमस्पेस यूजर चाहते हैं।
ktolis

6
"Acme \ AuctionBundle \ Entity \ User u से u का चयन करें जहां u.username =" $ उपयोगकर्ता नाम; = आप का उपयोग की गई आवश्यकताओं को पूरा करना चाहिए!
CappY

1
$this->get('security.context')->getToken()->getUser()स्वयं आपको उपयोगकर्ता ऑब्जेक्ट में लॉग इन करता है। आपको इसे फिर से क्वेरी करने की आवश्यकता नहीं है। वास्तव में, आप किस संस्करण का उपयोग कर रहे थे?
जीत
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.