2011-09-21 16 views
8

के साथ अच्छी तरह से काम करने के लिए मैं रेल 3 से 3.1 तक एक प्रोजेक्ट पोर्ट कर रहा हूं। मेरा प्रमाणीकरण सिस्टम आसानी से ActiveRecord में नए has_secure_password पर स्विच किया गया था। एकमात्र समस्या जो मैं चल रहा हूं वह यह है कि मैं ओमनीएथ का भी उपयोग करता हूं और मेरे पास सिस्टम सेट अप है, इसलिए यदि उपयोगकर्ता ओमनीएथ प्रदाताओं में से किसी एक का उपयोग करके साइन अप करता है तो खाते को पासवर्ड की आवश्यकता नहीं होती है। मैं has_secure_password द्वारा password_digest सत्यापन सेटअप को ओवरराइड नहीं कर सकता। क्या वैसे भी उन मान्यताओं को बंद करने और अपना खुद का लिखने के लिए वैसे भी है, या क्या मुझे साइट के अपने रेल 3 संस्करण से अपने पुराने हाथ लिखित बीक्रिप्ट फ़ंक्शंस का उपयोग करना होगा?रेलवे प्राप्त करना 3.1 है has_secure_password OmniAuth

उत्तर

5

मैं कस्टम तरीकों का उपयोग करने के लिए वापस जाने के लिए समाप्त हो गया। हालांकि, मुझे बाद में एहसास हुआ कि मुझे शर्तों की जांच करने के लिए पहले_विधीकरण कॉलबैक का उपयोग करने में सक्षम होना चाहिए था, फिर यदि वे मेल खाते हैं तो '0' जैसी सरल चीज़ को पासवर्ड_डिजिस्ट सेट करें। इस तरह पाचन कभी खाली नहीं होगा, लेकिन साथ ही इसे कभी भी सही पासवर्ड के रूप में मान्य नहीं करना चाहिए, जिससे उन्हें OmniAuth के माध्यम से साइन इन किया जा सके।

अगर मुझे गलत लगता है तो मुझे सही करने के लिए स्वतंत्र महसूस करें।

+0

मैं आपकी विधि का प्रयास करने जा रहा हूं, अगर आपको बेहतर तरीका मिल जाए तो मुझे बताएं। –

+3

यह आसान फिक्स की तरह लगता है। मैंने बस 'user.password_digest = SecureRandom.urlsafe_base64' को' '__nniauth' विधि में सेट किया है। (हालांकि, आपके उत्तर को दोबारा पढ़ने के बाद, मुझे लगता है कि इसे यादृच्छिक नहीं किया जाना चाहिए क्योंकि इसका प्रमाणीकरण के लिए उपयोग नहीं किया जा रहा है?)। यह देखते हुए यह बहुत तेज़ है - मुझे आश्चर्य है कि स्वीकार किए गए उत्तर का चयन करने के लिए तर्क क्या है? – umezo

+0

आप सही हैं। मैं आगे बढ़ गया और जवाब बदल दिया। हालांकि मैंने अभी भी सीधे बीसीआरपीटी का उपयोग करने और अपना पासवर्ड हैशिंग विधियों को लिखने का विकल्प चुना है। ऐसा करना बहुत आसान है और आपके इरादे स्पष्ट करता है। –

4

स्कॉट, आपका विचार सही है। मैं इस समस्या के साथ कुश्ती नहीं कर रहा हूं। मैंने 'has_secure_password' को ओवरराइड करने का प्रयास किया और यह बस काम नहीं करेगा। कोई फर्क नहीं पड़ता कि मैं कोड कहाँ अटक गया।

class User < ActiveRecord::Base 
    has_secure_password 

    validates_presence_of :password, :on => :create, :if => :password_required 

    # Associations 
    has_many :authentications 

    # Callbacks 
    before_validation :no_password_omniauth 

    # Gets set to true if the caller is trying to authenticate with omniauth. 
    @called_omniauth = false 

    # Build new omniauth users 
    def apply_omniauth(omniauth) 
    authentications.build(
    :provider => omniauth['provider'], 
    :uid => omniauth['uid']) 
    self.first_name = omniauth['user_info']['first_name'] if self.first_name.blank? 
    self.last_name = omniauth['user_info']['last_name'] if self.last_name.blank? 
    self.email = omniauth['user_info']['email'] if omniauth['user_info']['email'] && self.email.blank? 
    @called_omniauth = true 
    end 

    def password_required 
    return false if @called_omniauth == true 
    (authentications.empty? || !password.blank?) 
    end 

    private 

    def no_password_omniauth 
    self.password_digest = 0 unless password_required 
    end 

end 

apply_omniauth विधि नियंत्रक से कहा जाता हो जाता है जब किसी को प्रमाणित या साइन अप करने के प्रयास कर रहा है:

इसके बजाय मैं निम्नलिखित है।

इस विचार के लिए धन्यवाद कि आपने इसे खींचा है।

+0

मैंने आपके उत्तर को स्विच कर दिया क्योंकि आपने कोड उदाहरण प्रदान किया था। धन्यवाद। मुझे लगता है कि यह किसी भी प्रकार के पासवर्ड का उपयोग करके उस खाते में लॉग इन नहीं करेगा? –

+0

इसके अलावा, आप वास्तव में '@ called_omniauth' का उपयोग कर क्या कर रहे हैं? सिर्फ 'प्रमाणीकरण.empty का उपयोग नहीं करेंगे? || ! password_blank? 'आपकी' password_required' विधि में पर्याप्त है? –

+0

call_omniauth एकमात्र तरीका है कि आपका एप्लिकेशन जानता है कि उपयोगकर्ता omniauth (apply_omniauth विधि द्वारा) के माध्यम से साइन अप कर रहा है। – chourobin

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