2009-08-23 27 views
6

問候,CakePHP:在提交失敗時清除密碼字段

我正在設置一個包含密碼字段的相當標準的註冊表單。

的問題是,一個失敗的提交後(由於空字段,不正確的格式等),控制器重新加載註冊頁面,但用含有先前輸入的密碼的散列值的密碼字段。如何在每次提交失敗後將其清空?

查看:

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的密碼驗證的道路。

問題是,蛋糕哈希密碼第一,然後做驗證,這可能會導致輸入失敗,即使它是有效的根據您的規則。這就是密碼返回到輸入字段散列而不是普通的原因。


要解決此問題,而不是使用專用字段名稱'password',請使用不同的名稱,如'tmp_pass'。這樣,cakePHP Auth不會自動對該字段進行散列。

下面是一個示例形式

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...); 

最後,在你的供應商模式,實現beforeSave()。

首先,看看數據,用於驗證(「tmp_pass」將會對你的規則進行驗證)。

如果成功的話,手動哈希tmp_pass並把它放在$這個 - >數據[「供應商」] [「密碼」],然後返回true。如果不成功,則返回false。

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 - 這對我也很有幫助,但是我建議使用正確的'Auth-> password()'或'Auth-> hashPasswords()'函數比醃製和哈希自己。 – nickf 2009-11-11 05:47:28

+0

你應該**不要**用'sha1'自己填寫密碼,因爲這可能會引入與'Auth'(如果這就是你使用的)方式不一致的方式將密碼散列在路上。改用'$ this-> Auth-> password()'! – deceze 2009-11-11 05:48:05

+1

@deceze,查看源代碼,如果定義了'Auth :: hashPasswords()',將會調用'User :: hashPassword()'函數,而'Auth :: password()'不會。 – nickf 2009-11-11 06:08:17

8

這個?

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

謝謝的,這一個工程了。這是達到我想要的標準方式嗎? – 2009-08-23 18:12:06

+0

這就是你的表單輔助 – 2009-08-24 13:49:21

3

在你的控制器:

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

嗯設置輸入字段的值,這似乎有點哈克給我,因爲我有幾種類型的與數據庫不同的特性和用戶可在未來增加更多。但現在它的工作我想,謝謝:) – 2009-08-23 18:08:41