2012-04-25 3 views
14

मेरे पास Symfony 2.0.x के लिए FOSUserBundle के बारे में कोई प्रश्न है। वहां प्रलेखन में आप उपयोगकर्ता नाम और ईमेल के साथ काम करने के लिए लॉगिन बदलने का एक तरीका ढूंढ सकते हैं। यह बहुत अच्छा काम करता है! लेकिन मैं सिर्फ ईमेल के साथ काम करने के लिए लॉगिन करना चाहता हूं। इसलिए मैंने अपने कस्टम यूज़र मैनेजर (मूल से विस्तारित) में एक फ़ंक्शन जोड़ा जो सुनिश्चित करता है कि आप बस अपने ईमेल से लॉगऑन कर सकते हैं।ईमेल के साथ FOSUserBundle लॉगिन (Symfony2)

namespace Frontend\UserBundle\Model; 

use FOS\UserBundle\Entity\UserManager; 
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; 

class CustomUserManager extends UserManager 
{ 
    public function loadUserByUsername($email) 
    { 
     /*$user = $this->findUserByUsernameOrEmail($username); 

     if (!$user) { 
      throw new UsernameNotFoundException(sprintf('No user with name "%s" was found.', $username)); 
     } 

     return $user;*/ 

     //Change it to only email (Default calls loadUserByUsername -> we send it to our own loadUserByEmail) 
     return $this->loadUserByEmail($email); 
    } 

    public function loadUserByEmail($email) 
    { 
     $user = $this->findUserByEmail($email); 

     if (!$user) { 
      throw new UsernameNotFoundException(sprintf('No user with email "%s" was found.', $email)); 
     } 

     return $user; 

    } 
} 

लेकिन अब मुझे एक समस्या है कि मुझे सत्र में सहेजे गए मानों को नियंत्रित करने की आवश्यकता है। वह सत्र में अपना उपयोगकर्ता नाम सहेजता है और जब सिस्टम यह जांचता है तो वहां कोई ईमेल नहीं होगा (क्योंकि वह केवल ईमेल पर जांच करता है) उपलब्ध है।

तो मेरा प्रश्न यह है कि आप उपयोगकर्ता नाम चर के अंदर संग्रहीत मान को कैसे/कहां बदल सकते हैं।

धन्यवाद!

उत्तर

27

इस उपयोगकर्ता इकाई में setters अधिभावी द्वारा किया जा सकता:

<?php 

namespace Acme\UserBundle\Entity; 

use FOS\UserBundle\Entity\User as BaseUser; 
use Doctrine\ORM\Mapping as ORM; 
use Gedmo\Mapping\Annotation as Gedmo; 

/** 
* @ORM\Entity(repositoryClass="Acme\UserBundle\Entity\UserRepository") 
* @ORM\Table(name="users") 
*/ 
class User extends BaseUser 
{ 

    // ... 

    // override methods for username and tie them with email field 

    /** 
    * Sets the email. 
    * 
    * @param string $email 
    * @return User 
    */ 
    public function setEmail($email) 
    { 
     $this->setUsername($email); 

     return parent::setEmail($email); 
    } 

    /** 
    * Set the canonical email. 
    * 
    * @param string $emailCanonical 
    * @return User 
    */ 
    public function setEmailCanonical($emailCanonical) 
    { 
     $this->setUsernameCanonical($emailCanonical); 

     return parent::setEmailCanonical($emailCanonical); 
    } 

    // ... 

} 

यह अपने प्रश्न से स्पष्ट है, लेकिन अपने नामस्थान से नहीं है मुझे लगता है आप अपने खुद के बच्चे के बंडल अपनी मूल बंडल के रूप में FOSUserBundle का उपयोग करता है कि (FOSUserBundle documentation के अनुसार, उदाहरण "बी")।

आप करते हैं, आप तो आसानी से फार्म और टेम्पलेट्स यूआई से किसी भी username फ़ील्ड निकालें और उन्हें email क्षेत्रों के साथ बदलने के लिए क्रम में ओवरराइड कर सकते हैं। चूंकि आपने ऊपर के अनुसार ईमेल सेटर्स को ओवरराइड कर दिया है, username संपत्ति ठीक से आबादी में आ जाएगी।

हालांकि यह काम करता है, यह एक बहुत अच्छा समाधान नहीं है। नकारात्मकता यह है कि आपके पास अभी भी username और usernameCanonical डेटाबेस में कॉलम होंगे। हम मूल रूप से इन्हें पूरी तरह से हटाना चाहते थे, लेकिन इसके लिए FOSUserBundle में बहुत से परिवर्तनों की आवश्यकता होगी (उपयोगकर्ता नाम विशेषता \FOS\UserBundle\Model\UserInterface द्वारा आवश्यक है, और बंडल कोड इस पर निर्भर करता है)।

14

मुझे एक बहुत ही सरल समाधान मिला, शायद सबसे अच्छा नहीं बल्कि सादगी शक्ति है! ;)

मैं यहां लिख रहा हूं अगर यह किसी के लिए अच्छा है।

मैं प्रदाताओं में उपयोगकर्ता नाम/ईमेल लॉगिन विकल्प डाल:

एप्लिकेशन/conf/security.yml में:

providers: 
    fos_userbundle: 
     id: fos_user.user_provider.username_email 

और फिर अपनी प्रवेश फार्म को देखते हुए मैं केवल के साथ लॉगिन करने के लिए करते हैं इनपुट प्रकार = "ईमेल":

<input type="email" class="form-control" id="username" placeholder="E-Mail" name="_username" required="required"/> 
+0

हे नोफ्लैग के लिए धन्यवाद - यह काम मेरे लिए बिल्कुल सही था। मैं इसे कॉन्फ़िगरेशन संदर्भ में ढूंढ रहा था। लेकिन, क्योंकि यह वास्तव में सुरक्षा कॉन्फ़िगरेशन में है [FOSUserBundle कॉन्फ़िगरेशन संदर्भ] में नहीं है (https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/configuration_reference.md)। किसी और के लिए जिसने वही किया था - आपको इसे [FOSUserBundle के लिए सुरक्षा कॉन्फ़िगरेशन दस्तावेज़] में देखना होगा (https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/logging_by_username_or_email.md)। – jfgrissom

+0

यह एचटीएमएल 5 इनपुट प्रकार है, हाल ही के ब्राउज़र के लिए केवल –

+1

हालांकि यह काम करता है और वैसे भी करने के लिए समझ में आता है, ध्यान रखें कि कोई उपयोगकर्ता देव उपकरण खोल सकता है और 'type = "ईमेल"' टाइप 'टाइप = "टेक्स्ट" ' फिर उपयोगकर्ता नाम के साथ लॉग इन करें।यह स्पष्ट रूप से आपकी स्थिति पर निर्भर करता है कि क्या यह एक समस्या होगी या नहीं। – bassplayer7