2013-01-10 54 views
5

के बजाय ईमेल का उपयोग कर सिम्फनी 2 प्रमाणीकरण/लॉगिन लॉगिन मैं आज सिम्फनी 2 का उपयोग करके एक लॉगिन फॉर्म बनाने की कोशिश कर रहा हूं जहां कोई उपयोगकर्ता अपने ईमेल पते और पासवर्ड का उपयोग करके लॉगिन कर सकता है। मेरे पास बहुत सारी समस्याएं हैं और अंत में यह एहसास हुआ कि यह केवल तभी काम करेगा जब मेरे संपत्ति AdminUser इकाई वर्ग में हो। मैंने उपयोगकर्ता नाम के बजाय ईमेल का उपयोग करने की कोशिश की है, जहां कोई संभव हो तो कृपया बताएं कि $username क्यों आवश्यक है या मैं गलत कहां गया हूं? इसके अलावा, मेरे login.html.twig फ़ाइल में मैं अभी भी _email के बजाय _username का उपयोग कर रहा हूं यदि इससे कोई फर्क पड़ता है?उपयोगकर्ता नाम

AdminUser इकाई:

namespace XXX\WebsiteBundle\Entity; 

use Symfony\Component\Security\Core\User\UserInterface; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* AdminUser 
* 
* @ORM\Table(name="admin_user",indexes={@ORM\Index(name="indexes", columns={"deleted"})}) 
* @ORM\Entity 
* @ORM\HasLifecycleCallbacks() 
*/ 
class AdminUser implements UserInterface 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @var string 
* 
* @ORM\Column(name="name", type="string", length=45) 
*/ 
private $name; 

/** 
* @var string 
* 
* @ORM\Column(name="email", type="string", length=45, unique=true) 
*/ 
private $email; 

/** 
* @var string 
* 
* @ORM\Column(name="salt", type="string", length=255) 
*/ 
private $salt; 

/** 
* @var string 
* 
* @ORM\Column(name="password", type="string", length=255) 
*/ 
private $password; 

/** 
* @var integer 
* 
* @ORM\Column(name="enabled", type="integer", options={"default" = 0}) 
*/ 
private $enabled; 

/** 
* @var string[] $roles 
* 
* @ORM\Column(name="roles", type="array") 
*/ 
private $roles = array(); 

private $username; 


/** 
* Gets the username. 
* 
* @return string The username. 
*/ 
public function getUsername() 
{ 
    return $this->email; 
} 

/** 
* Erases the user credentials. 
*/ 
public function eraseCredentials() 
{ 

} 


/** 
* Returns the roles granted to the user. 
* 
* <code> 
* public function getRoles() 
* { 
*  return array('ROLE_USER'); 
* } 
* </code> 
* 
* Alternatively, the roles might be stored on a ``roles`` property, 
* and populated in any number of different ways when the user object 
* is created. 
* 
* @return Role[] The user roles 
*/ 
public function getRoles() { 
    return $this -> roles; 
} 

/** 
* Set the roles of the user 
* 
* @var string[] $roles 
* 
* @return \XXX\WebsiteBundle\Entity\User this 
*/ 
public function setRoles(array $roles) { 
    $this -> roles = $roles; 

    return $this; 
} 



} 

मेरे security.yml फ़ाइल है:

jms_security_extra: secure_all_services (मैं कुछ getters और setters जो लागू नहीं हैं हटा दिया है) मेरी कोड के नीचे है: झूठी अभिव्यक्ति: सत्य

security: 
encoders: 
    XXX\WebsiteBundle\Entity\AdminUser: sha512 

role_hierarchy: 
    ROLE_ADMIN:  ROLE_USER 
    ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

providers: 
    main_provider: 
     entity: { class: XXX\WebsiteBundle\Entity\AdminUser, property: email } 

firewalls: 
    dev: 
     pattern: ^/(_(profiler|wdt)|css|images|js)/ 
     security: false 

    admin_firewall: 
     pattern: ^/admin.* 
     anonymous: ~ 
     form_login: 
      login_path: /admin/login 
      check_path: /admin/login_check 

access_control: 
    - { path: ^/admin/login.*, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/admin.*, roles: ROLE_ADMIN } 
+0

उपयोगकर्ता इंटरफ़ेस आवश्यकता को पूरा करने के लिए आपको AdminUser में getUsername() विधि प्राप्त करनी होगी। लेकिन यह आपके पास ईमेल लौटा सकता है जैसे आपके पास है। संपत्ति: ईमेल आपको बस इतना करना चाहिए। क्या हो रहा है यह सत्यापित करने के लिए आप EntityUserProvider क्लास में देख सकते हैं। शायद एक ताजा इंस्टॉलेशन के साथ शुरू करें? कभी-कभी मैं परेशानी शूटिंग करते समय गड़बड़ करता हूं। – Cerad

उत्तर

0

इस थोड़े hackish है, लेकिन आप अपने पंजीकरण फार्म से उपयोगकर्ता नाम फ़ील्ड को दूर कर सकता है, और अपने उपयोगकर्ता इकाई में, ऐसा करते हैं:

public function setEmail($email) 
{ 
    $this->email = $email; 
    $this->username = $email; 
} 
+1

हाँ मुझे लगता है, हालांकि मैं सर्वोत्तम प्रथाओं को सीखने और अधिक हैकिंग को रोकने की कोशिश कर रहा हूं। मुझे यह पृष्ठ मिला - http://symfony.com/doc/current/cookbook/security/entity_provider.html#authenticating-someone-with-a-custom-entity-provider मुझे AdminUserRepository बनाना होगा? – user1961082

8

मुझे लगता है कि आप ईमेल के साथ संपत्ति बदलना चाहिए और यह भी आप बदल सकते हैं कुछ भी आप से चाहते हैं के साथ _username पैरामीटर:

entity: 
      entity: 
       class:    SecurityBundle:User 
       property:   username 

और

firewalls 
    form_login: 
     username_parameter: _username 

हो सकता है आप 01 पर एक नजर है चाहिए

+1

मेरे लिए काम करता है, केवल "टुकड़ा" इसे UserInterface इंटरफेस के कारण उपयोगकर्ता नाम() विधि प्राप्त करता है। – Cesar

+1

securty.yml के अंतर्गत काम करता है -> फ़ायरवॉल -> मुख्य -> ​​form_login: -> username_parameter: ईमेल और कोर इनपुट नाम = 'ईमेल' –

+0

अधिक जानकारी http://symfony.com/doc/2.3/reference/configuration/security .html –

0

FOSUserBundle का प्रयास करें और उपयोग करें।

उपयोगकर्ताओं के लिए उनके उपयोगकर्ता नाम या ईमेल फ़ील्ड के साथ लॉगिन करने में सक्षम होने के लिए यह डिफ़ॉल्ट feature है।

+3

FOSUserBundle केवल ईमेल द्वारा लॉगिन की अनुमति नहीं देता है। यह केवल उपयोगकर्ता नाम की अनुमति देता है और यदि उपयोगकर्ता नाम या ईमेल कॉन्फ़िगर किया गया है। बस सोचा कि मैं इस प्रश्न का उत्तर मांगने वालों को यह स्पष्ट कर दूंगा। – Twifty

+0

यदि प्रश्न उपयोगकर्ता प्रमाणीकरण को लागू करने के विभिन्न तरीकों के बारे में था, तो यह एक वैध उत्तर होगा। लेकिन उपयोगकर्ता की समस्या उल्लिखित बंडल से संबंधित नहीं है। –

1
firewalls: 
main: 
    form_login: 
    username_parameter: _email 

आपका सभी कोड सही है, आपको केवल सुरक्षा.आईएमएल फ़ाइल में थोड़ा बदलाव करने की आवश्यकता है। बस username_parameter जोड़ें।