2012-05-10 6 views
10

के साथ लॉगिन करें, वैसे ही अधिकांश वेबसाइटें काम करती हैं, मुझे डेटाबेस में "UsErNaMe" स्टोर करना था, लेकिन उपयोगकर्ताओं को "उपयोगकर्ता नाम" के साथ लॉगिन करने देना था।डेविस: उपयोगकर्ताओं को "UsErNaMe" के रूप में पंजीकरण करने दें, लेकिन "उपयोगकर्ता नाम"

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

उदाहरण के लिए, इस ब्लॉग पोस्ट पर विचार करें: http://anti-pattern.com/2011/5/16/case-insensitive-keys-with-devise

[...] आप शायद समस्या यह है कि कुछ उपयोगकर्ता अपने लॉगिन (ईमेल और/या उपयोगकर्ता नाम में कुछ अक्षर टाइप करना चाहते आई है), अपरकेस लेकिन यह केस-संवेदी होने के लिए जब वे प्रवेश करने का प्रयास की उम्मीद है। में एक नहीं अनुचित अनुरोध [...]

कूल! मैं यही चाहता था।

उनका समाधान:

# config/initializers/devise.rb 
Devise.setup do |config| 
    config.case_insensitive_keys = [:email, :username] 
end 

समाधान मैं खोज रखना है कि।

# Configure which authentication keys should be case-insensitive. 
# These keys will be downcased upon creating or modifying a user and when used 
# to authenticate or find a user. Default is :email. 
config.case_insensitive_keys = [ :username, :email ] 

विशेष रूप से: लेकिन यहाँ कि config विकल्प के लिए दस्तावेज़ है "इन कुंजियों बनाने/एक उपयोगकर्ता को संशोधित करने पर downcased किया जाएगा।" दूसरे शब्दों में, डेटाबेस में उपयोगकर्ता नाम कम किया जा रहा है।

सत्यापित करने के लिए:

User.create username: "UsErNaMe", password: "secret", email: "[email protected]" 
#=> <User username="username"...> 

Am मैं कुछ दर्दनाक स्पष्ट याद आ रही?

उत्तर

10

devise wiki से: आपको अपने मॉडल में devise's find_first_by_auth_conditions विधि को ओवरराइट करने की आवश्यकता है।

ActiveRecord उदाहरण:

def self.find_first_by_auth_conditions(warden_conditions) 
    conditions = warden_conditions.dup 
    if login = conditions.delete(:login) 
    where(conditions).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).first 
    else 
    where(conditions).first 
    end 
end 

आप OR lower(email) = :value हिस्सा निकाल सकते हैं अगर आप भी ईमेल द्वारा प्रमाणन जरूरत नहीं है।

इस तरह आपको case_insensitive_keys में username सूचीबद्ध करने की आवश्यकता नहीं है और यह डेटाबेस में डाउनसाइड नहीं किया जाएगा।

+0

यह निश्चित रूप से केवल तभी काम करेगा यदि आपने घोषित किया है: उपयोगकर्ता मॉडल में लॉगिन वर्चुअल विशेषता, इसे अपनी रचना के रूप में सेट करें: प्रमाणीकरण_कीएस => [: लॉगिन] और अपने लॉगिन फॉर्म में उस विशेषता का उपयोग करें। –

+6

भी, हालांकि आप डेटाबेस में केस-संवेदनशील प्रविष्टि की अनुमति देते हैं, आप यह सुनिश्चित करना चाहते हैं कि विशिष्टता केस-असंवेदनशील है, अन्यथा, आप 'उपयोगकर्ता नाम' और 'उपयोगकर्ता नाम' दोनों की अनुमति देते हैं लेकिन कम से कम खोज उन्हें पुनर्प्राप्ति पर रोक देगा। तो validates_uniqueness_of जोड़ें: उपयोगकर्ता नाम,: case_sensitive => झूठी –

+0

कार्य करता है। इसके अलावा, अच्छा सुझाव, विक्टर। – danneu

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