cakephp3 — хешированный пароль не соответствует при сравнении

Версия CakePHP: 3.3.5

Я создаю простую систему, в которой пользователи могут войти (используя электронную почту и пароль), а после входа они могут изменить свой пароль.

Для этого я использую DefaultPasswordHasher

У меня уже было несколько пользователей в моей базе данных. Их запись уже присутствовала. Поэтому, когда я сделал функцию входа, это сработало. Я сравнил пароль, который вводит пользователь, со скрытым паролем, уже присутствующим в БД. Проверка прошла успешно, и пользователь смог войти в систему.

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

Я поделюсь своим контроллером здесь. Это довольно просто.

namespace Api\Controller;
use Cake\Utility\Security;
use Cake\Utility\Hash;
use Cake\Auth\DefaultPasswordHasher;
use Api\Controller\AppController;

class LoginController extends AppController
{
public function initialize()
{
parent::initialize();
$this->loadComponent('RequestHandler');
}

//Function to reset the password
public function resetPassword()
{
$pass   = $this->request->data['pass'];
$hasher = new DefaultPasswordHasher();
$hashedPass = $hasher->hash($pass);

$this->loadModel('Login');
//save it to db
$responseArray      = $this->Login->resetPassword($hashedPass);
$this->set(compact('responseArray'));
$this->set('_serialize', ['responseArray']);
}

//Function to login
public function login()
{
if ($this->request->is('post'))
{
//Password submitted via form
$pass   = $this->request->data['pass'];

//Hashed password fetched from db via a function call
$actualPassword = 'hashedPasswordString'

//Compare password submitted and hash from db
if($this->checkPassword($pass,$actualPassword))
{
$result = 'password matched';
}
else
{
$result = 'password doesnot match';
}
}
$this->set(compact('result'));
$this->set('_serialize', ['result']);
}

//Function to compare password and hash
public function checkPassword($passedPassword , $actualPassword)
{
if ((new DefaultPasswordHasher)->check($passedPassword, $actualPassword)) {
return true;
} else {
return false;
}
}

}

Может кто-нибудь сказать мне, почему пароли не совпадают. Я новичок в рамках CakePHP. Заранее спасибо!

0

Решение

Вот как выглядит мой рабочий процесс сброса пароля. Я не могу сказать из вашего поста, как выглядит ваша сущность и таблица.

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

Администратор / UsersController.php

public function password($id = null)
{
$user = $this->Users->get($id, [
'fields' => ['id', 'first_name', 'last_name', 'username']
]);
if ($this->request->is('put')) {
if ($this->request->data['password'] == $this->request->data['password2']) {
$this->Users->patchEntity($user, ['password' => $this->request->data['password']]);
$this->Users->save($user);
$this->Flash->success('Password has been updated');
return $this->redirect('/admin/users/password/' . $id);
} else {
$this->Flash->error('Passwords do not match');
}
}

$this->set(compact('user'));
}

Модель / Entity / User.php

protected function _setPassword($password)
{
if (strlen($password) > 0) {
return (new DefaultPasswordHasher)->hash($password);
}
}
1

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

public function changePassword(){
if ($this->request->is('post')) {
$data = $this->request->data();
$res['success'] = FALSE;
$user = $this->Users->get($this->Auth->user('id'))->toArray();
if ((new DefaultPasswordHasher)->check($data['oldPassword'], $user['password'])) {
if($data['newPassword'] == $data['confPassword']){
$userEntity = $this->Users->get($this->Auth->user('id'));
$userEntity->password = $data['newPassword'];
if($this->Users->save($userEntity)){
$res['success'] = TRUE;
$res['message'] = 'Password Changed Successfully.';
}
}else{
$res['success'] = FALSE;
$res['message'] = 'Confirm password is not same as new password. please enter both password again!!';
}

}else{
$res['success'] = FALSE;
$res['message'] = 'Your old password is wrong!';
}
echo json_encode($res);
exit();

}
}
0