2015-09-24 2 views
0

Я делаю приложение с cakephp 3, теперь я tring, чтобы сделать функцию, позволяющую пользователям изменять свои пароли. Проблема в том, что проверка пароля не работает. Я не знаю, правильно ли я поступаю.CakePHP 3- Проверка для смены пароля не работает

Вот файл chage_password.ctp:

<div class="users form large-9 medium-9 columns"> 
<?= $this->Form->create() ?> 
<fieldset> 
    <legend><?= __('Actualice su contraseña') ?></legend> 
    <?= $this->Form->input('password1',['type'=>'password' ,'label'=>'Ingrese Contraseña']) ?> 
    <?= $this->Form->input('password2',['type' => 'password' , 'label'=>'Reescriba su Contraseña'])?> 
</fieldset> 
<?= $this->Form->button(__('Agregar')) ?> 
<?= $this->Form->end() ?> 

Вот функция Changepassword в UsersControler.php:

public function changePassword($id) 
{   
    $user_data=$this->Users->get($id); 
    if (!empty($this->request->data)) { 
     $user = $this->Users->patchEntity($user_data, [ 
        'password' => $this->request->data['password1']      
        ], 
        ['validate' => 'password'] 
       ); 
     $time = Time::now(); 
     $user->set('fecha_cambio_password',$time); 
     if ($this->Users->save($user)) { 
      $this->Flash->success('Contraseña Actualizada'); 
      $this->redirect('/users/login'); 
     } else { 
      debug($user);die; 
      $this->Flash->error('No se pudo actualizar la contraseña!'); 
     } 
    } 
} 

И, наконец, проверка в UsersTable.php:

public function validationPassword(Validator $validator) 
{ 
    $validator 
     ->add('password1', [ 
      'length' => [ 
       'rule' => ['minLength', 6], 
       'message' => 'El largo minimo es 6', 
      ] 
     ]) 
     ->add('password1',[ 
      'match'=>[ 
       'rule'=> ['compareWith','password2'], 
       'message'=>'Los campos no coinciden', 
      ] 
     ]) 
     ->notEmpty('password1'); 
    $validator 
     ->add('password2', [ 
      'length' => [ 
       'rule' => ['minLength', 6], 
       'message' => 'El largo minimo es 6', 
      ] 
     ]) 
     ->add('password2',[ 
      'match'=>[ 
       'rule'=> ['compareWith','password1'], 
       'message'=>'Los campos no coinciden', 
      ] 
     ]) 
     ->notEmpty('password2'); 

     return $validator; 
} 

ответ

4

Я нашел решение!

Вам необходимо пройти поля пароля в 2 аргумента метода patchEntity()

 $user = $this->Users->patchEntity($user, [ 
       'old_password' => $this->request->data['old_password'], 
       'password'  => $this->request->data['password1'], 
       'password1'  => $this->request->data['password1'], 
       'password2'  => $this->request->data['password2'] 
      ], 
      ['validate' => 'password'] 
     ); 

Для того, чтобы проверить старый пароль, то нужно изменить свой текущий валидатор следующим образом:

public function validationPassword(Validator $validator) 
{ 

    $validator 
     ->add('old_password','custom',[ 
      'rule'=> function($value, $context){ 
       $user = $this->get($context['data']['id']); 
       if ($user) { 
        if ((new DefaultPasswordHasher)->check($value, $user->password)) { 
         return true; 
        } 
       } 
       return false; 
      }, 
      'message'=>'The old password is not correct!', 
     ]) 
     ->notEmpty('old_password'); 

    $validator 
     ->add('password1', [ 
      'length' => [ 
       'rule' => ['minLength', 6], 
       'message' => 'Min value is 6', 
      ] 
     ]) 
     ->add('password1',[ 
      'match'=>[ 
       'rule'=> ['compareWith','password2'], 
       'message'=>'Los campos no coinciden', 
      ] 
     ]) 
     ->notEmpty('password1'); 
    $validator 
     ->add('password2', [ 
      'length' => [ 
       'rule' => ['minLength', 6], 
       'message' => 'El largo minimo es 6', 
      ] 
     ]) 
     ->add('password2',[ 
      'match'=>[ 
       'rule'=> ['compareWith','password1'], 
       'message'=>'Los campos no coinciden', 
      ] 
     ]) 
     ->notEmpty('password2'); 

    return $validator; 
} 

Приветствия!

+0

Это работает, спасибо! –

Смежные вопросы