重置密码功能蛋糕PHP


Reset password function CakePHP

如果我的用户忘记了密码,我希望允许他们重置密码,我现在正在使用 CakePHP。(即我用他们的新临时密码向他们发送邮件)。

但是有一个问题。存储在数据库中的密码由身份验证组件散列,这意味着如果我尝试从我的用户模型中选择全部,我将获得密码的散列版本。此外,我不知道如何在生成新密码后保存密码哈希。

我一直在谷歌上搜索一段时间以找到答案,但似乎找不到任何如何做到这一点的例子。

有没有人尝试过类似的事情或知道如何做?

好的,2.x 肯定会提供更多控制。我只像您一样在我的用户模型的 beforeSave 方法中对密码进行哈希处理:

public function beforeSave() {
    if (isset($this->data['User']['password'])) { 
        $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
    }
    return true;
}

这允许您在控制器的密码重置操作中创建纯文本形式的密码,通过电子邮件将其发送给用户,然后在用户模型中设置密码并保留它(密码在到达数据库之前进行哈希处理)。这里重要的是,在控制器调用 save 方法之前,密码将保持纯文本。

通常,我总是在控制器操作中的密码字段上添加一个未设置,这将保存用户记录,以确保它不会被重新散列。第二个选项是向用户模型添加一个 afterFind 回调,该回调在每次加载用户模型时执行取消设置。

关于一次性重置密钥....我的 User 对象中有一个附加字段,我在两种情况下使用。电子邮件验证和密码重置。创建用户时,它设置为 SHA1( + + )。链接将通过电子邮件发送给用户,该链接将用户发送到用户控制器的验证操作。验证该密钥后,该列将在数据库中清除。

与密码重置相同。当他们请求重置时,将以相同的方式生成值,并通过电子邮件向用户发送指向用户控制器重置操作的链接。他们输入用户标识,如果链接中的密钥与数据库行中的密钥匹配,则可以更改密码。更改其密码时,将再次清除此值。

发送临时密码的最大问题是它创建了一个 DoS 机制(针对用户,而不是您的网站)。如果我决定骚扰某人,我可以创建一个每小时不断重置密码的任务。在检查电子邮件之前,他们无法进入,但随后它会再次更改。使用密钥,他们将收到一封带有重置链接的电子邮件,但他们当前的密码仍然有效,因为重置代码的存在不会阻止他们登录。

我认为您无法将加密密码转换为解密。因此,如果您想读出如何重置密码,请读出cakephp的CakeDC插件。

https://github.com/CakeDC/users

这是 CakePHP 的标准插件。

试试这个

function admin_reset($token = null) {
        /**
         * if logged in, send to home/dashboard page
         */
        if (count($this->Session->read("Auth.User"))) {
            return $this->redirect('/');
        }
        $this->set('title_for_layout', 'Reset Password');
        $this->layout = 'admin';
        $this->User->recursive = -1;
        if (!empty($token)) {
            $u = $this->User->findBytokenhash($token);
            if ($u) {
                $this->User->id = $u['User']['id'];
                if (!empty($this->data)) {
                    $this->User->data = $this->data;
                    $this->User->data['User']['username'] = $u['User']['username'];
                    $new_hash = sha1($u['User']['username'] . rand(0, 100)); //created token
                    $this->User->data['User']['tokenhash'] = $new_hash;

                    if ($this->User->save($this->User->data, false)) {
                        $this->Session->setFlash(__('Password has been updated.'), 'default', array('class' => 'alert alert-success'));
                        $this->redirect(array('controller' => 'users', 'action' => 'login'));
                    }
                }
            } else {
                $this->Session->setFlash(__('Token corrupted. Reset link work only for once, please try again.'), 'default', array('class' => 'alert alert-success'));
            }
        } else {
            //$this->redirect('/');
        }
    }