2016-02-02 8 views
5

मैं ईमेल के साथ लॉग इन करने और FOSUserBundle के साथ उपयोगकर्ता नाम नहीं के लिए सेवा प्रदाता बनाने की तलाश में था।सेवा प्रदाता के साथ ईमेल के साथ FOSUserBundle लॉगिन, सर्वोत्तम अभ्यास

सबसे पहले मैं डॉक here के अनुसार मेरी security.yml फाइल में यह लिखा:

security: 
    providers: 
     fos_userbundle: 
      id: fos_user.user_provider.username_email 

FOS दस्तावेज़ के अनुसार, मैं एक एक करके इन steps एक का पालन करें।

MyUserManager.php को छोड़कर मैंने लिखा इस (ढेर here पर एक और सवाल के अनुसार):

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; 

    } 
} 

और निश्चित रूप से मैं क्रम में इस तरह विशिष्ट गेटर और सेटर लागू करने के लिए उपयोगकर्ता वर्ग बदल दिया है:

namespace Acme\UserBundle\Entity; 

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

/** 
* @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); 
    } 

    // ... 

} 

लेकिन मैं इस तरह app\Resources\FOSUserBundle\views\Security\login.html.twig में FOSUser टेम्पलेट प्रपत्र owerride:

{% block fos_user_content %} 
    <form action="{{ path("fos_user_security_check") }}" method="post"> 

    <input type="hidden" name="_csrf_token" value="{{ csrf_token }}"/> 

    <label class="" for="username">E-mail</label> 
    <input type="email" class="" id="username" name="_username" required="required"/> 

    <label class="" for="password">{{ 'security.login.password'|trans }}</label> 
    <input class="" type="password" id="password" name="_password" required="required"/> 

    <label class="" for="remember_me"> 
     <input type="checkbox" id="remember_me" name="_remember_me" class=""> 
     <span class="">{{ 'security.login.remember_me'|trans }}</span> 
    </label> 

    <button class="" type="submit" id="_submit" name="_submit" value="{{ 'security.login.submit'|trans }}"> 
     LogIn 
    </button> 
    </form> 
{% endblock fos_user_content %} 

यह उपयोगकर्ता के ईमेल क्षेत्र और उपयोगकर्ता नाम से लॉग इन करने की अनुमति देने का एक अच्छा तरीका है?

+2

हाँ, आप इस तरह उपयोग कर सकते हैं। मैं इस तरह काम कर रहा हूं और यह ठीक है। –

+0

@ MertÖKSÜZ उत्तर के लिए धन्यवाद, अगर यह अच्छा है तो मुझे उम्मीद है कि यह अन्य सिम्फनी प्रेमियों की मदद कर सकता है! –

+0

मुझे आशा है :) धन्यवाद। –

उत्तर

4

आपका दृष्टिकोण FOSUserBundle पर एक ईमेल-पासवर्ड प्रमाणीकरण सेटअप के लिए पूरी तरह से अनिवार्य परिवर्तनों को फिर से शुरू करता है।

अभी के लिए, मैंने इकाई और सुरक्षा कॉन्फ़िगरेशन में केवल उसी कॉन्फ़िगरेशन का उपयोग किया है (टेम्पलेट की आवश्यकता नहीं है क्योंकि मेरा लॉगिन AJAX में किया जाता है)।

username हमेशा की email क्षेत्र मूल्य का उपयोग कर सेट किया गया है, यह आपके CustomUserManager बनाने के लिए उपयोगी है: केवल संदेह मैं पीछा कर रहा है?
यदि उपयोगकर्ता setEmail और setEmailCanonical में आपकी इकाई द्वारा किया गया है, तो उपयोगकर्ता नाम हमेशा ईमेल के बराबर होता है, तो loadByUsername काम करेगा।

क्या यह सिर्फ एक अतिरिक्त सुरक्षा है?

संपादित करें ईमेल कर सकते हैं करने के लिए उपयोगकर्ता नाम से

बदलें प्रपत्र भवन/सत्यापन में कुछ comportment बदलने के लिए शामिल है।

हो सकता है कि आपको यह उत्तर को देखने के लिए है: https://stackoverflow.com/a/21064627/4363634

+1

जैसा कि मैं पढ़ सकता था सिम्फनी दस्तावेज़ पर, प्रमाणीकरण प्रक्रिया 'उपयोगकर्ता प्रदाताओं' पर निर्भर करती है। जब कोई उपयोगकर्ता ईमेल और पासवर्ड सबमिट करता है, तो प्रमाणीकरण परत कॉन्फ़िगर किए गए उपयोगकर्ता प्रदाता से किसी दिए गए तर्क (यहां ईमेल) के लिए उपयोगकर्ता ऑब्जेक्ट को वापस करने के लिए कहती है। तो मैं डॉक्टर के साथ फिट रहने के लिए UserManger का उपयोग करता हूं। मैं यह सुनिश्चित करने के लिए डॉक्टर का पालन कर रहा हूं कि यह सर्वोत्तम अभ्यास है। मुझे उम्मीद है कि आप समझेंगे कि मैं क्या करना चाहता हूं और अगर आपको इसकी ज़रूरत है तो यह आपकी मदद कर सकता है। –

+1

ठीक है अब मेरे लिए यह स्पष्ट है, सिम्फनी में सुरक्षा को कैसे प्रबंधित किया जाता है, इसके बारे में मुझे बहुत कुछ सीखना और दस्तावेज पढ़ना है। मैं इसके बारे में खोज करूंगा और अधिकतम उपयोग मामलों को सुनिश्चित करने के लिए निश्चित रूप से अगले के लिए अपना तर्क लागू करूंगा। आपके जवाब के लिए धन्यवाद। – chalasr

+0

आपका स्वागत है। मैं यह प्रश्न यह सुनिश्चित करने के लिए यहां पोस्ट करता हूं कि मैंने सही अभ्यास/विधि बनाई है और यदि कुछ नहीं है तो कुछ अन्य डेवलपर सुझाव प्राप्त करने के लिए। मुझे खुशी है अगर यह आपकी मदद कर सकता है। –

संबंधित मुद्दे