Я реализую функцию «запомнить меня» (CakePHP 3), которая сохраняет имя пользователя и хешированный пароль в файле cookie. Моя проблема в том, что мне не удается сопоставить хешированный пароль в файле cookie с хешированным паролем в базе данных.
Я использую DefaultPasswordHasher для создания как хэша базы данных, так и хэша cookie. Сначала я думал, что они совпадут, но, похоже, это не так.
Моя вторая мысль заключалась в том, что у DefaultPasswordHasher должна быть функция, которая могла бы проверить, что оба хэша исходят от одного и того же пароля, но его функция check() принимает пароль в виде простого текста: https://api.cakephp.org/3.3/class-Cake.Auth.DefaultPasswordHasher.html
Подобные вопросы в Интернете, похоже, применимы к более старым версиям Cake или неубедительны.
Из сущности пользователя:
protected function _setPassword($password)
{
if (strlen($password) > 0) {
return (new DefaultPasswordHasher)->hash($password);
}
}
Из функции входа в систему UsersController()
// Remember login?
if ($this->request->getData()['remember_me'] == "true") {
// Hash the user's password
$savedUser = [
'password' => (new DefaultPasswordHasher)->hash($this->request->getData()['password']),
'username' => $this->request->getData()['username']
];
// Save login for 1 month
$result = $this->Cookie->write('cookie_name', $savedUser, true, '1 month');
}
Из функции Initialize() AppController:
// Load logged in user
$loggedInUserID = $this->Auth->user('id');
// If not logged in try cookie
if( !$loggedInUserID && $cookie = $this->Cookie->read('cookie_name') ) {
error_log("Attempting to log in from cookie. Username: ".$cookie['username']);
$user = $this->Users->find('all', [
'conditions' => [
'username' => $cookie['username'],
'password' => $cookie['password'],
'is_deleted' => 0
]
])
->first();
// If a user was found, try to login
if ($user) {
if($this->Auth->login($user)) {
error_log("Successfully logged in from cookie. Username: ".$cookie['username']);
$loggedInUserID = $this->Auth->user('id');
} else {
error_log("Couldn't log in from cookie. Username: ".$cookie['username']);
$this->redirect('/users/logout'); // destroy session & cookie
}
}
}
(Для ясности я сохранил свои временные сообщения журнала ошибок.)
Файл cookie вроде бы сохраняется корректно, но его хэш не совпадает с базой данных, что означает, что пользователь, соответствующий этому файлу cookie, никогда не будет найден.
Проблема в том, что два хэша должны совпадать? Или я должен использовать функцию для сопоставления двух хэшей друг с другом?
check()
? - person Zimano   schedule 02.09.2019