我正在使用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并检查我的数据库,我看到密码的值已更改为哈希值,但我再次无法使用新密码登录。
还有一种盐'我的Users表中永远不会更改的字段。
我猜测问题是盐需要使用密码哈希进行更新才能正确解密,但我不确定如何更新盐。我可以在我的控制器中获取它并直接设置值,还是通过AuthComponent以其他方式处理?
关于此主题的其他帖子似乎与我一直使用的代码一致,但我还没有找到任何试图直接设置密码值。
答案 0 :(得分:0)
使用beforeSave()
中的内容。 (不要在Controller中尝试散列路径)。
如果没有散列,只需进行一些标准调试,找出为什么它没有进入代码的那一部分:
debug($this->data);
exit;
if (isset($this->data['User']['password'])) {
// IT'S NOT GETTING HERE
//...
这是“回答”只是调试代码的一个方面,因为很明显,只要看到数据中的内容和时间,就可以确切地知道发生了什么以及为什么。