Обновлять пароль только если поле заполнено - PullRequest
3 голосов
/ 28 ноября 2011

Мое представление:

  <tr>
    <td>Username</td>
    <td><?php echo $this->Form->input('User.username', array('label' => '')); ?></td>
  </tr>
  <tr>
    <td>Password</td>
    <td><?php echo $this->Form->password('User.password', array('label' => '', 'value'=>'')); ?></td>
  </tr>

Мой контроллер:

    function edit($id = null) {

        $this->User->id = $id;

        $data = $this->data;
#       print_r($data);

        if (empty($data)) {
            $this->data = $this->User->read();
        } else {
            if ($this->User->save($data)) {
                $this->Session->setFlash('The user details have been updated.');
                $this->redirect(array('action' => 'index'));
            }
        }

    }

В момент, когда я отправляю форму с пустым паролем, хэш в базе данных все еще изменяется.Как я могу обновить хэш пароля, только если был введен новый пароль.

Спасибо.

РЕДАКТИРОВАТЬ: $ data ['User'] ['password'] всегда является хэшем иникогда не пусто!

Ответы [ 5 ]

3 голосов
/ 28 ноября 2011

CakePHP 1.3 автоматически хеширует поле password. CakePHP 2.0 нет.

У вас есть несколько вариантов (от худшего к лучшему, на мой взгляд):

  1. Переименуйте свое поле и поменяйте местами перед сохранением

    if ($data['User']['new_password'] != '') {
        $data['User']['password'] = $this->Auth->password($data['User']['new_password']);
    }
    
  2. Хеш-строка в проверке равенства

    if ($data['User']['password'] == $this->Auth->password('')) {
        unset($data['User']['password']);
    }
    
  3. Измените хэш-функцию на функцию, которая не хэширует пустые пароли [см. книга для конфигурации]:

    function hashPasswords($data) {
        if (!empty($this->data['User']['password'])) {
            $this->data['User']['password'] = $this->Auth->password($this->data['User']['password']);
        }
        return $data;
    }
    
3 голосов
/ 28 ноября 2011

Если поле пароля не заполнено, отмените его.

else {
       if(empty($data['User']['password']))
       {
          unset($data['User']['password']);
       }
       if ($this->User->save($data)) {
          $this->Session->setFlash('The user details have been updated.');
           $this->redirect(array('action' => 'index'));
       }
}
1 голос
/ 28 ноября 2011

Вы можете unset переменная от $data

function edit($id = null) {

    $this->User->id = $id;

    $data = $this->data;

    if (empty($data)) {
        $this->data = $this->User->read();
    } else {
        if($data['User']['password'] == ''){
            unset($data['User']['password']);
        }
        if ($this->User->save($data)) {
            $this->Session->setFlash('The user details have been updated.');
            $this->redirect(array('action' => 'index'));
        }
    }
}
0 голосов
/ 28 ноября 2011

вы можете использовать поведение, которое обрабатывает его для вас: http://www.dereuromark.de/2011/08/25/working-with-passwords-in-cakephp/

тогда вы можете использовать поле "pwd" и установить для параметра false значение (если вы не хотите использовать поле pwd_confirm)

0 голосов
/ 28 ноября 2011

Вы можете попробовать обновить только определенные поля, основываясь на случае IF:

       if(empty($data['User']['password']))
       {
          $this->User->id = $user_i; // specify which User to update
          //update only username
          $this->User->save(array('User'=>array('User.username'=>$data['User']['username'])));
       }
       else{
          //save as before
       }
...