【问题标题】:Reset password function CakePHP重置密码功能 CakePHP
【发布时间】:2013-10-14 14:41:44
【问题描述】:

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

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

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

有没有人尝试过类似的方法或知道我该怎么做?

【问题讨论】:

  • 您是否通过谷歌搜索找到this 的主题?
  • 我想我错过了这个问题。我个人建议不要发送临时密码,因为它会破坏散列的目的。但是如果你必须创建一个临时密码,生成它、发送它、散列它、存储它?
  • 目前我的用户模型中有这个: public function beforeSave($options = array()) { $this->data['User']['password'] = AuthComponent::password( $this->data['User']['password']);返回真;这是否意味着密码字段附带的所有内容都将被散列?
  • 我也反对发送临时密码。我通常会生成一个只能使用一次的密钥来重置他们的密码。也就是说,您使用的是哪个版本的 CakePHP? AuthComponent 在 1.x 和 2.x 之间发生了相当大的变化。
  • @ErikNedwidek 我正在使用 Cake 2.4。并且创建一个“只工作一次”的密码不是更高级吗?

标签: php cakephp authentication


【解决方案1】:

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

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

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

一般来说,我总是在控制器操作中的密码字段上添加一个取消设置,以保存用户记录,以确保它不会被重新散列。第二种选择是向您的用户模型添加一个 afterFind 回调,该回调在每次加载用户模型时都会取消设置。

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

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

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

【讨论】:

    【解决方案2】:

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

    https://github.com/CakeDC/users

    这是 cakephp 的标准插件。

    【讨论】:

      【解决方案3】:

      试试这个

      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('/');
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2019-06-04
        • 2013-05-17
        • 2013-09-12
        • 2020-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-01
        相关资源
        最近更新 更多