如何在CakePHP中保存自动生成的密码?

时间:2011-03-15 16:48:27

标签: cakephp cakephp-1.3 registration authentication

我正在尝试自动注册用户。您输入一个电子邮件地址,它会向用户发送密码。听起来很简单吧?以下是我在添加操作中尝试过的一些内容,但它们都没有工作(如图所示)。

if (!empty($this->data)) {
    $this->User->create();

    $random_pass = $this->Auth->password($this->generatePassword());

    // Doesn't work:
    $user_data['User'] = $this->data['User'];
    $user_data['User']['password'] = $random_pass;
    if ($this->User->save($user_data)) { /* ... */ }

    // Doesn't work:
    $this->User->set('password', $random_pass);
    if ($this->User->save($this->data)) { /* ... */ }

    // Doesn't work:
    $this->data['User']['password'] = $random_pass;
    if ($this->User->save($this->data)) { /* ... */ }

    // Doesn't work:
    $this->data['User'][0]['password'] = $random_pass; 
    if ($this->User->saveAll($this->data)) { /* ... */ }

}

根据Why is the CakePHP password field is empty when trying to access it using $this->data?,这是因为Auth组件正在删除密码。似乎很常见,不是吗?那我该如何解决呢?

更多信息

我正在使用this function来生成密码。添加视图只有三个字段,first_name,last_name和email(分配给Auth组件中的用户名字段)。

4 个答案:

答案 0 :(得分:2)

首先......你可以做到

$random_pass = $this->Auth->password($this->generatePassword());
pr($random_pass);

确保该变量中确实存在数据......

然后您可以使用...

保存该数据
$this->data['User']['password'] = $random_pass;
$this->User->save($this->data);

另请注意......在测试过程中你有if(!empty($ this-> data)) 因此,请确保通过在表单中​​的某处输入某种形式的默认数据来进行测试。

答案 1 :(得分:0)

也许您的用户模型中定义了一些不满意的验证规则?您可以尝试通过打印$this->validationErrors来检查此问题(或只是检查您的用户模型以查看是否有任何规则)。

答案 2 :(得分:0)

JohnP在评论中回答了这个问题。我在beforeSave动作中有一些垃圾。删除,现在它的工作完美。再次感谢JohnP!

答案 3 :(得分:0)

我正在使用Cake PHP 2.3.3并且以下代码适用于我

public function recover()
{
  if ($this->request->is('post') )
  {
    $this->loadModel('AclManagement.User');
    $passwords = AuthComponent::password($this->data['User']['password']);
    $this->User->query("UPDATE users SET password = '".$passwords."' WHERE password_change = '".$this->request->data['User']['id']."' ");
    $this->Session->setFlash(__('Password Saved Sucessfully'), 'success');
    $this->redirect(array('action' => 'login'));
  } else {
    $this->set('resettoken', $_REQUEST['id']);
  }
}