2012-04-29 5 views
4

Я строю страницу, на которой пользователь может изменить свой пароль. Они должны заполнить два поля, и оба должны совпадать, прежде чем они будут изменены, а затем они будут перенаправлены на страницу своего профиля при успешном завершении.Изменение пароля для пользователя в CakePHP 2.1

До сих пор я построил следующий метод:

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 и сохранить это в поле пароля базы данных, используя хеширование безопасности. Но то, что происходит, это создание нового пользователя вместо этого, но с пустыми данными ... Что я делаю неправильно здесь? И как мне сравнить два поля пароля ...

+0

вы можете позволить поведение заботиться о том, что: http://www.dereuromark.de/2011/08/25/working-with- passwords-in-cakephp/- или, по крайней мере, взять некоторые из предлагаемых функций, чтобы найти подходящее решение для вашего собственного подхода. – mark

+0

Почему мой код создает нового пользователя? – Cameron

+0

Для сравнения с полями паролей. http://stackoverflow.com/questions/17185246/password-confirm-validation-cakephp/18017468#18017468 – Ketan

ответ

1

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

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

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

PS: от взгляда на вашем методе ваши скрытые поле «Идентификатор» всегда остается пустым, как $ пользовательские данные не передаются от контроллера!

+1

также использовать FieldList для белых списков или лучше компоненты безопасности, чтобы избежать какой-либо закалки с формой, которая привела бы к риск безопасности. – mark

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

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

Как ваша форма Подавать с Идент пользователя id так, если выполнить save() с данными запроса, торт будет просто обновить запись, вместо того, чтобы создать из-за id поле (если запись существует против этого id в таблице). Выше кода просто обновите password2 с помощью пароля Hash в запросах.

0

Нельзя ли указать действие в своей форме?

echo $this->Form->create('User', array('action' => 'edit')); 
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']); 
    } 
} 
Смежные вопросы