【问题标题】:change password to set value in cakephp更改密码以在 cakephp 中设置值
【发布时间】: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


【解决方案1】:

使用beforeSave() 中的内容。 (不要在Controller中尝试hash的路由)。

如果不是散列,只需进行一些标准调试并找出为什么它没有进入代码的那部分:

debug($this->data);
exit;
if (isset($this->data['User']['password'])) {
    // IT'S NOT GETTING HERE
    //...

这是其中的一个,其中“答案”只是对调试代码的一个推动,因为很明显,您可以通过查看数据中的内容和时间来准确了解发生了什么以及为什么。

【讨论】:

  • 但是我该如何调试呢?我没有看到 beforeSave 中的调试语句中的任何内容
  • 您使用了我提供的代码吗?包括exit; 紧随其后?如果你这样做了,但它仍然没有显示,你可能将调试模式设置为 0(关闭)。
  • 是的。调试模式设置在哪里?
  • 我在那里看到:Configure::write('debug', 1);是否需要代码来显示错误日志?
  • 将其更改为 2,并使用我在答案中提供的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多