2009-08-23 15 views
6

ग्रीटिंग्स,केकपीएचपी: असफल सबमिशन पर पासवर्ड समाशोधन

मैं पासवर्ड फ़ील्ड के साथ एक सुंदर मानक पंजीकरण फॉर्म स्थापित कर रहा हूं।

समस्या असफल सबमिशन (खाली फ़ील्ड, गलत प्रारूप इत्यादि के कारण) के बाद है, नियंत्रक पंजीकरण पृष्ठ को पुनः लोड करता है, लेकिन पहले से दर्ज पासवर्ड के हैंश किए गए मान वाले पासवर्ड फ़ील्ड के साथ। प्रत्येक असफल सबमिशन के बाद मैं इसे खाली कैसे कर सकता हूं?

दृश्य:

echo $form->password('Vendor.password', array('class' => 'text-input')); 

नियंत्रक:

Security::setHash('sha1'); 
$this->Auth->sessionKey = 'Member'; 
$this->Auth->fields = array(
    'username' => 'email', 
    'password' => 'password' 
); 

मदद की बहुत सराहना की है, धन्यवाद!

उत्तर

9

आप cakePHP पासवर्ड सत्यापन के साथ सड़क के नीचे एक और समस्या में पड़ सकता है।

समस्या यह है कि केक हैश पासवर्ड पहले, तो सत्यापन करता है, जो आपके नियमों के अनुसार मान्य होने पर भी इनपुट विफल हो सकता है। यही कारण है कि पासवर्ड सामान्य के बजाय इनपुट फ़ील्ड में वापस लौटा दिया जाता है।


बजाय विशेष क्षेत्र का नाम 'पासवर्ड' का उपयोग करने का इसे ठीक, 'tmp_pass' की तरह एक अलग नाम का उपयोग करें। इस तरह, केकेपीएचपी ऑथ स्वचालित रूप से मैदान को हश नहीं करेगा।

यहां नमूने के रूप

echo $form->create('Vendor', array('action' => 'register')); 
echo $form->input('email'); 
echo $form->input('tmp_pass', array('label' => 'Password','type'=>'password')); 
echo $form->end('Register'); 

आपके वेंडर मॉडल में है, के बजाय 'tmp_pass' के लिए इन नियमों आवंटित 'पासवर्ड' के लिए सत्यापन नियमों असाइन नहीं करते उदाहरण के लिए

var $validate = array('email' => 'email', 'password' => ... password rules...); 

var $validate = array('email' => 'email', 'tmp_pass' => ... password rules...); 

अंत में, अपने विक्रेता मॉडल में, पहले सेव() लागू करें।

सबसे पहले, देखें कि डेटा मान्य है ('tmp_pass' आपके नियमों के विरुद्ध मान्य होगा)।

सफल होने पर, मैन्युअल रूप से हैश tmp_pass और इसे $-> डेटा ['विक्रेता'] ['पासवर्ड'] में डाल दें और फिर सत्य लौटाएं। असफल होने पर, झूठी वापसी करें।

function beforeSave() { 
    if($this->validates()){ 
     $this->data['Vendor']['password'] = sha1(Configure::read('Security.salt') . $this->data['User']['tmp_pass']); 
     return true; 
    } 
    else 
     return false; 
} 
+1

+1 - यह मेरे लिए बहुत उपयोगी था, हालांकि मैं उचित 'एथ-> पासवर्ड()' या 'एथ-> हैशपैसवर्ड()' फ़ंक्शंस का उपयोग करने का सुझाव देना चाहता हूं खुद को सलाम और खुद को धोने से। – nickf

+0

आपको ** sha1' के साथ अपना पासवर्ड नहीं होना चाहिए, क्योंकि यह ** ** 'एथ' (यदि आप इसका उपयोग कर रहे हैं) के साथ असंगतताएं पेश कर सकते हैं तो सड़क को पासवर्ड से नीचे रखता है। इसके बजाय '$ this-> ऑथ-> पासवर्ड()' का उपयोग करें! – deceze

+1

@deceze, स्रोत को देखते हुए, 'Auth :: हैशपैसवर्ड() 'उपयोगकर्ता :: हैशपैसवर्ड()' फ़ंक्शन को परिभाषित किए जाने पर कॉल करेगा, जबकि 'Auth :: password()' नहीं है। – nickf

8

यह?

password('Vendor.password', array('class' => 'text-input','value'=>'')) 
+0

धन्यवाद, यह भी काम करता है। क्या यह मुझे प्राप्त करने का मानक तरीका है? –

+0

इस प्रकार आप फ़ॉर्म हेल्पर –

3

अपने नियंत्रक में:

function beforeRender() { 
    parent::beforeRender(); 
    $this->data['Vendor']['password'] = ''; 
} 
+0

हम्म के लिए इनपुट फ़ील्ड का मान सेट करते हैं, यह मेरे लिए थोड़ा हैकी लगता है, क्योंकि मेरे पास डीबी में विशिष्ट गुणों वाले कई प्रकार के उपयोगकर्ता हैं और भविष्य में और अधिक जोड़ सकते हैं।लेकिन अब के लिए यह अनुमान लगाता है, धन्यवाद :) –

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