您可能會遇到另一個問題來與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 - 這對我也很有幫助,但是我建議使用正確的'Auth-> password()'或'Auth-> hashPasswords()'函數比醃製和哈希自己。 – nickf 2009-11-11 05:47:28
你應該**不要**用'sha1'自己填寫密碼,因爲這可能會引入與'Auth'(如果這就是你使用的)方式不一致的方式將密碼散列在路上。改用'$ this-> Auth-> password()'! – deceze 2009-11-11 05:48:05
@deceze,查看源代碼,如果定義了'Auth :: hashPasswords()',將會調用'User :: hashPassword()'函數,而'Auth :: password()'不會。 – nickf 2009-11-11 06:08:17