CakePHP Сброс пароля без изменения пароля - PullRequest
0 голосов
/ 28 октября 2011

У меня есть следующая функция в приложении CakePHP 1.3, которая берет токен и позволяет пользователю сменить пароль. Кажется, все работает нормально, за исключением того, что пароль на самом деле не меняется: / Есть идеи, в чем проблема?

function admin_changepassword ( $token = null )
    {
        // If has a token or form has been submitted
        if (!empty($token) || !(empty($this->data)))
        {   
            $user = $this->User->find('first',array("MD5(User.email + '".Configure::read('Security.salt')."')"=>$token));

            if (empty($user))
            { 
                $this->redirect(array('admin'=>false,'controller'=>'pages','action'=>'display','home'));
                $this->Session->setFlash('Invalid token'); 
            }
            else
            {
                $this->set('user',$user);
                if (!empty($this->data['User']['password']))
                { 
                    $user['User']['password'] = $this->data['User']['password']; 
                    $this->User->save($this->data); 
                    $this->Session->setFlash('Your password has been changed! Please log in.'); 
                    $this->redirect(array('admin'=>true,'controller' => 'users', 'action' => 'login'));
                }   
            }
        }
        else
        {
            $this->redirect(array('admin'=>false,'controller'=>'home','action'=>'display','home'));
            $this->Session->setFlash('No token');
        }
    }

Ответы [ 3 ]

1 голос
/ 29 октября 2011

Хорошо, после некоторого тестирования, ваша проблема, как я изначально предложил в своем комментарии.

Вы не устанавливаете id вашего пользователя, поэтому:

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

не обновляет пароль, он добавляет новую строку в вашу базу данных.

Вам необходимо указать идентификатор пользователя для обновления.

$user = $this->User->find('first',array("MD5(User.email + 
                            '".Configure::read('Security.salt')."')"=>$token));

// this line is redundant 
$user['User']['password'] = $this->data['User']['password'];  


$this->User->id = $user['User']['id']; // set user id
$this->User->save($this->data);  //  save it

Если выпроверьте вашу users таблицу. Я подозреваю, что вы найдете много пустых записей с «измененным» паролем.Мое тестирование согласуется с руководством по торту.

1 голос
/ 28 октября 2011

Лично я бы сделал что-то подобное; но я предполагаю, что ваш пользователь действительно вошел в систему, используя компонент auth или аналогичный. Непроверенные; но логика выглядит так, как будто она должна работать для меня.

<?php
function admin_changepassword ($token = NULL) {
    // bail out early if there is no token set, and always set the flash before redirecting.
    if($token==NULL) {
        $this->Session->setFlash('No token');
        $this->redirect(array('admin'=>false,'controller'=>'home','action'=>'display','home'));
    }

    // this is an admin action; the user already be logged in right?
    $this->User->id = $this->Auth->user('id');
    $user_password = $this->User->field('password');

    // does the token match the hashed password, and did they enter a new password?
    if($token==md5($user_password . Configure::read('Security.salt')) && !empty($this->data['User']['password'])) {
        $this->User->saveField('password', $this->data['User']['password']);    
        $this->Session->setFlash('Your password has been changed! Please log in.'); 
        $this->redirect(array('admin'=>true,'controller' => 'users', 'action' => 'login'));
    }

    // somethings gone wrong/password was not updated
    $this->Session->setFlash('Your password was not changed.'); 
    $this->redirect(array('admin'=>false,'controller'=>'home','action'=>'display','home'));
}
0 голосов
/ 25 сентября 2012

Это старая ветка, но она может кому-то помочь

function changePwd(){
     $this->User->id = $this->data->['User']['id']; //assuming this is set
     //check if the password fields are empty
     //check if the password fields match (password and confirm password one)

    //convert password 
    $this->request->data['User']['password'] = $this->Auth->password($this->data['User']['password'] );

    //saveField worked for me
    if($this->User->saveField('password',$this->request->data['User']['password'])){
        $this->Session->setFlash('Password changed successfully.','flashSuccess');
    }else{ ....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...