CakePHP 3 — проверка для изменения пароля не работает

Я делаю приложение с 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;
}

0

Решение

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

Вам нужно передать поля пароля во втором аргументе метода 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;
}

Ура!

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru