2010-02-01 11 views
5

में रिक्त पासवर्ड की बल सत्यापन, मैं अपने रेल एप्लिकेशन में पासवर्ड रीसेट सुविधा जोड़ रहा हूं जो Authlogic का उपयोग करता है। मैं यहां गाइड का अनुसरण कर रहा था: http://www.binarylogic.com/2008/11/16/tutorial-reset-passwords-with-authlogic/ और सबकुछ काम करता है जैसा कि मैं एक चीज़ को छोड़कर चाहता हूं: पासवर्ड रीसेट फॉर्म रिक्त पासवर्ड स्वीकार करता है और बस उन्हें नहीं बदलता है।Authlogic

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

1) किसी ने Google समूह पर यह एक ही प्रश्न पूछा:

User model saves with blank password

बेन की प्रतिक्रिया @user.validate_password = true उपयोग करने के लिए पासवर्ड के सत्यापन के लिए मजबूर किया गया था। मैंने कोशिश की लेकिन मुझे एक अपरिभाषित विधि त्रुटि मिली: undefined method 'validate_password_field=' for #<User>

2) ignore_blank_passwords नामक एक औथ्लोगिक कॉन्फ़िगरेशन विकल्प प्रतीत होता है। यह यहाँ प्रलेखित है:

Module: Authlogic::ActsAsAuthentic::Password::Config#ignore_blank_passwords

यह लगता है कि यह काम करेगा, लेकिन मैं समझता हूँ कि यह एक वैश्विक विन्यास विकल्प है कि आप उपयोगकर्ता मॉडल में अपने प्रारंभिक acts_as_authentic कॉल में उपयोग है, और मुझे नहीं पता इसे एप्लिकेशन-व्यापी में बदलना चाहते हैं, क्योंकि मेरे पास उन उपयोगकर्ताओं के लिए एक नियमित संपादन फ़ॉर्म है जहां मैं डिफ़ॉल्ट रूप से रिक्त पासवर्ड को अनदेखा करना चाहता हूं।

किसी को भी इसका समाधान मिला? मैं validate_password= को एथलॉगिक 1.4.1 के परिवर्तन लॉग में देखता हूं और तब से इसके बारे में कुछ भी नहीं हटाया गया है। क्या मैं बस इसे गलत तरीके से उपयोग कर रहा हूं? क्या प्रति अनुरोध आधार पर ignore_blank_passwords का उपयोग करने का कोई तरीका है?

उत्तर

5

यह मैंने किया।

class User < ActiveRecord::Base 
    attr_accessor :ignore_blank_passwords 

    # object level attribute overrides the config level 
    # attribute 
    def ignore_blank_passwords? 
    ignore_blank_passwords.nil? ? super : (ignore_blank_passwords == true) 
    end 
end 

अब आप अपने नियंत्रक में, गलत पर ignore_blank_passwords विशेषता निर्धारित किया है।

user.ignore_blank_passwords = false 

यहां, आप ऑथलोगिक की सीमाओं के भीतर काम कर रहे हैं। आपको सत्यापन तर्क को बदलने की ज़रूरत नहीं है।

1

शायद नियंत्रक में पैरामीटर के मूल्य का परीक्षण करें? (एयर कोड):

def update 
    @user.password = params[:user][:password] 
    @user.password_confirmation = params[:user][: password_confirmation] 

    if @user.changed? && @user.save 
    flash[:notice] = "Password successfully updated" 
    redirect_to account_url 
    else 
    render :action => :edit 
    end 
end 

आप मूल रूप से जाँच कर रहे हैं, तो authlogic उपयोगकर्ता रिकॉर्ड बदल (जो यह पासवर्ड यदि नहीं करता है:

def update 
    @user.password = params[:user][:password] 
    @user.password_confirmation = params[:user][: password_confirmation] 
    if @user.password.blank? 
    flash[:error] = "Password cannot be blank" 
    render :action => :edit 
    return 
    end 
    if @user.save 
    flash[:notice] = "Password successfully updated" 
    redirect_to account_url 
    else 
    render :action => :edit 
    end 
end 
1

अलावा zetetic के समाधान से आप इसे इस तरह से कर सकता है खाली है)। अन्य ब्लॉक में आप यह जांच सकते हैं कि पासवर्ड खाली था या नहीं, उपयोगकर्ता रिकॉर्ड में एक उचित त्रुटि संदेश जोड़ें या एक फ्लैश संदेश प्रदर्शित करें।

8

यह एक पुराना धागा है, लेकिन चूंकि यह अनुत्तरित है, इसलिए मैं इसे पोस्ट करूंगा।

मैंने अन्य समाधानों की तुलना में इसे थोड़ा अधिक साफ करने में कामयाब रहा है, "स्वयं" के साथ लेखांकन मान्यताओं की सहायता करना।

मैं उपयोगकर्ता को यह कहा:

class User < ActiveRecord::Base 

    ... 

    attr_writer :password_required 

    validates_presence_of :password, :if => :password_required? 

    def password_required? 
    @password_required 
    end 

    ... 
end 

आप एक attr_accessor बनाने और :if => :password_required (कोई पूछताछ) का उपयोग करके दो पंक्तियों के लिए यह कम कर सकते हैं, लेकिन मैं पूछताछ संकेत के साथ इस दूसरे वाक्य रचना पसंद करते हैं।

फिर अपने नियंत्रक कार्रवाई इस तरह किया जा सकता है:

def update 
    @user.password = params[:user][:password] 
    @user.password_confirmation = params[:user][: password_confirmation] 
    @user.password_required = true 

    if @user.save 
    flash[:notice] = "Password successfully updated" 
    redirect_to account_url 
    else 
    render :action => :edit 
    end 
end 

यह एक स्थानीय प्रभाव पड़ेगा; शेष एप्लिकेशन प्रभावित नहीं होंगे (जब तक password_required अन्य स्थानों पर सत्य पर सेट नहीं किया गया है)।

मुझे उम्मीद है कि यह मदद करता है।

+0

मैं 'ignore_blank_paswords' विशेषता का उपयोग करने में सक्षम था। विवरण के लिए मेरा जवाब देखें। –

2
User.ignore_blank_passwords = false 

मॉडल का उपयोग करें, इस संपत्ति को स्थापित करने के लिए ऑब्जेक्ट नहीं।

def update_passwords 
    User.ignore_blank_passwords = false 
    if @user.update_attributes(params[:user]) 
    ... 
    end 
    User.ignore_blank_passwords = true 
end 
+0

क्या यह पूरे मॉडल के लिए नहीं बदलेगा? मैं केवल एक क्रिया में रिक्त पासवर्ड को अनदेखा करना चाहता हूं। –

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