您可能会遇到另一个问题来与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