允许用户更改密码Cakephp 2

时间:2012-11-29 19:10:27

标签: passwords cakephp-2.0

我已经查看了各种方法,并就此主题发表了各种问题,但没有运气。在我的情况下,控制器代码“出现”工作,并且消息闪烁“您的更改已保存”,但密码数据库字段未更改。有什么我想念的吗?

控制器代码

public function changepass($id = null) {
    $this->layout = 'profile_page';
    //$this->request->data['User']['id'] = $this->Session->read('Auth.User.id');

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


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

        if ($this->User->save($this->request->data))
        {   
            $this->Session->setFlash(__('Your password has been changed!'));
            $this->redirect(array('controller'=>'articles','action'=>'index'));
        }
        else
        {
            $this->Session->setFlash(__('Whoops! Something went wrong... try again?'));
            $this->redirect(array('controller'=>'users','action'=>'changepass'));
        }
    }
    $this->request->data = $this->User->read(null, $id);
    unset($this->request->data['User']['password']); // tried commenting out
}

模型

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

当然后来我会进行现有的密码检查,并确认新的密码检查,但我需要让现有的密码更新基本方法正常工作。

非常感谢您可以提供的任何光线,

我想我已经怀疑了。首先,在我看来,主要的bloop - 在我看来我将回声$ this-> Form-> create('User',array('action'=>'edit')); - 当然改变行动为'changepass'

新控制器代码:

    public function changepass ($id = null) {
    $this->layout = 'profile_page';
    $this->User->id = $id;
    if (!$this->User->exists()) {
        throw new NotFoundException(__('Invalid user'));
    }
            //debug($this->request->data);

    if ($this->request->is('post') || $this->request->is('put')) {
        $this->data['User']['password']= $this->request->data['User']['newpass'];
        if ($this->User->save($this->request->data)) {
            $this->Session->setFlash(__('Your password changes have been saved'));
             $this->redirect(array('controller' => 'articles', 'action' => 'index'));
        } else {
            $this->Session->setFlash(__('The profile could not be saved. Please, try again.'));
         }
    } else {
                if ($this->Auth->user('id')!= $id) {
        $this->Session->setFlash('You are not allowed that operation!');
        $this->redirect(array('controller' => 'articles', 'action' => 'index'));
        }

        $this->request->data = $this->User->read(null, $id);  
        debug($this->request->data);
        unset($this->request->data['User']['password']);
    }
}

模特 - 根据eboletaire的建议整理

    public function beforeSave($options = array()) {
    if (isset($this->data[$this->alias]['password'])) {
        $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']); 
    }
    if (isset($this->data[$this->alias]['newpass'])) {
        $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['newpass']);
    }

return true;
}  

2 个答案:

答案 0 :(得分:3)

if ($this->request->is('post') || $this->request->is('put')) {
    $this->data['User']['password']= $this->request->data['User']['newpass'];
    if ($this->User->save($this->request->data)) {

应该是

if ($this->request->is('post') || $this->request->is('put')) {
    $this->data['User']['id'] = $id;
    $this->data['User']['password']= $this->request->data['User']['newpass'];
    if ($this->User->save($this->data)) {

请注意$this->data vs $this->request->data

答案 1 :(得分:1)

首先,您要保存密码两次。删除/评论此行:

$this->User->saveField('password', AuthComponent::password($this->request->data['User']['newpass']));

无论如何,我认为问题出在您的模型中。看看你的beforeSave方法。为什么首先使用字段密码设置密码,然后使用字段newpass ???

PD。清理你的代码我也看到可能第二个如果应该在第一个之外。

相关问题