在CakePHP 2.1中更改用户的密码

时间:2012-04-29 15:46:44

标签: php cakephp

我正在构建一个用户可以更改密码的页面。他们必须填写两个字段,两个字段必须匹配才能更改,然后在成功时将其重定向到其个人资料页面。

到目前为止,我已经构建了以下方法:

public function changePassword()
{

    $user = $this->User->find('first', array( 
                'conditions' => array(
                    'User.id' => $this->Auth->user('id')) 
            ));

    if ($this->request->is('post') || $this->request->is('put'))
    {
        if ($this->User->save($this->request->data))
        {
            $this->User->saveField('password', AuthComponent::password($this->request->data['User']['password2']));

            $this->Session->setFlash(__('Your password has been changed!'));
            $this->redirect(array('controller'=>'profiles','action'=>'view','userName'=>$user['User']['username']));
        }
        else
        {
            $this->Session->setFlash(__('Whoops! Something went wrong... try again?'));
        }
    }

}

这是表格:

<?php echo $this->Form->create(); ?>

    <?php echo $this->Form->input('id',array('type'=>'hidden')); ?>

    <?php echo $this->Form->input('password1',array('type'=>'text','label'=>array('text'=>'Enter your new password'))); ?>

    <?php echo $this->Form->input('password2',array('type'=>'text','label'=>array('text'=>'Confirm your new password'))); ?>

    <button type="submit">Save</button>

<?php echo $this->Form->end(); ?>

因此,您可以看到计划是使用password2中的内容,并使用安全散列将其保存在数据库密码字段中。但是会发生什么呢?它会创建一个新的用户而不是空白数据......我在这里做错了什么?我如何比较两个密码字段...

4 个答案:

答案 0 :(得分:1)

最可能的问题是你以某种方式将表单中的id丢失回控制器操作。 没有数据数组中存在的id,蛋糕假定它必须创建一个条目。

所以调试你发布的数据并确保它没有丢失,或者在保存之前手动分配id。

$this->request->data['User']['id'] = $this->Session->read('Auth.User.id');

PS:从您的方法看,您的隐藏“id”字段始终为空,因为$ user数据未从控制器传递下来!

答案 1 :(得分:1)

公共功能恢复()     {

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

答案 2 :(得分:0)

$this->request->data['User']['password2'] = AuthComponent::password($this->request->data['User']['password2']);

$this->User->save($this->request->data);

当您的表单与auth用户id一起提交时,如果您使用请求数据执行save(),则蛋糕只会更新您的记录,而不是由于id字段而创建(如果有的话)记录存在于表中的id。上面的代码只需在请求数据中使用哈希密码更新password2

答案 3 :(得分:0)

您不应该在表单中指定操作编辑吗?

    echo $this->Form->create('User', array('action' => 'edit'));