【发布时间】:2014-07-10 18:40:04
【问题描述】:
我正在使用 Cake 2.1.1 并尝试编写一个 ajax 函数来将用户密码重置为特定格式。我已经能够更改密码,但无法使新密码实际用于登录用户。
我的用户控制器中有这个功能:
function ajax_reset_password(){
$this->autoRender=false;
$user = $this->User->find('first',array(
'conditions'=>array('User.email'=>$_GET['email'])
));
$this->User->id = $user['User']['id'];
$pass = $_GET['name'].'2014';
$passHashed= $this->Auth->password($pass);
$this->User->set('password', $pass);
$this->User->set('updated_at',date("Y-m-d H:i:s"));
$this->User->save();
//... code to email user new password
}
这是我保存前的用户控制器:
public function beforeSave(){
if (isset($this->data['User']['password'])) {
$this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
}
return true;
}
如果我运行这个函数并检查我的数据库,我可以看到密码的值已从字面上更改为“name2014”,但我无法使用该密码登录。
如果我将密码设置为 $passHashed 并检查我的数据库,我看到密码的值已更改为散列值,但同样,我无法使用新密码登录。
在我的用户表中还有一个永远不会改变的“盐”字段。
我猜问题是盐需要使用密码哈希更新才能正确解密,但我不确定如何更新盐。我可以在我的控制器中获取它并直接设置值,还是使用 AuthComponent 以其他方式处理?
关于这个主题的其他帖子似乎与我一直使用的代码配合得很好,但我也没有发现任何试图直接设置密码值的帖子。
【问题讨论】:
-
为什么要散列两次?您应该让模型层处理散列,不需要额外的东西。此外,您可能想查看this article。也许您喜欢关于如何以干净的方式存储和更新密码的 DRY 方法。
-
ajax函数中的hash只是一个测试。似乎 beforeSave 永远不会运行,因为如果我不在 ajax 函数中这样做,密码不会被散列
标签: php cakephp passwords cakephp-2.1