Почему глючит функция password_verify?

Всем привет!

почему-то функция password_verify работает не правильно

примеры кода:

создание хеша в методе beforeValidate:
if(in_array($this->scenario, ['userCreate','singUp'])) {
                $this->password_hash = $this->setPassword($this->password);
  }


метод $this->setPassword
public function setPassword($password)
    {
        return $this->password_hash = Yii::$app->security->generatePasswordHash($password,5);
    }


в общем создается хеш пароля 12345678 ($2y$05$WjKwE1MiWPyPFghASGGcdupFqfcUHchkb2y/rwTiCWe40iIbqyxKq) и записывается в бд
после проверяем пароль:
public function validatePassword($attribute, $params)
    {
        if (!$this->hasErrors()) {
            $user = $this->getUser();

            if (!$user || !$user->validatePassword($this->password)) {
                $this->addError($attribute, 'Неправильный логин или пароль.');
            }
        }
    }
//метод validatePAssword
public function validatePassword($password)
    {
        return Yii::$app->security->validatePassword($password, $this->password_hash);
    }


в password_hash найденного юзера находится сгенеренный выше кеш и пароль 12345678

но в итоге функция password_verify в методе Yii::$app->security->validatePassword отдает false

да еще пробовал проверять хеш сразу после создания в методе setPassword до записи в бд - валидацию проходит, но потом уже этот хеш не проходит по паролю 12345678
  • Вопрос задан
  • 2007 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
php > var_dump(password_verify(null, '$2y$05$WjKwE1MiWPyPFghASGGcdupFqfcUHchkb2y/rwTiCWe40iIbqyxKq'));
bool(true)
php > var_dump(password_verify('', '$2y$05$WjKwE1MiWPyPFghASGGcdupFqfcUHchkb2y/rwTiCWe40iIbqyxKq'));
bool(true)

Проверяйте, от чего именно вы получаете хеш. И когда вы его получаете. Где-то там сам пароль потерян и осталась пустая строка.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
27cm
@27cm
TODO: Написать статус
в общем создается хеш пароля 12345678 ($2y$05$WjKwE1MiWPyPFghASGGcdupFqfcUHchkb2y/rwTiCWe40iIbqyxKq)

Это видимо хеш какого-то другого пароля:

<?php $password = '12345678';
 
var_dump(password_verify($password, '$2y$05$WjKwE1MiWPyPFghASGGcdupFqfcUHchkb2y/rwTiCWe40iIbqyxKq'));
// bool(false)

var_dump(password_verify($password, password_hash($password, PASSWORD_DEFAULT, ['cost' => 5])));
// bool(true)

https://ideone.com/suj3Rq
Ответ написан
slo_nik
@slo_nik Куратор тега Yii
Добрый вечер.
Что Вы хотите добиться в методе beforeValidate()?

В первом validatePassword(), как я понимаю в модели LoginForm, не надо передавать параметры.
public function validatePassword()
    {
        if (!$this->hasErrors()) {
            $user = $this->getUser();

            if (!$user || !$user->validatePassword($this->password)) {
                $this->addError('password', 'Неправильный логин или пароль.');
            }
        }
    }


Попробуйте убрать beforeValidate(), думаю, что в этом проблема.

p.s. Используйте $this->setPassword() при регистрации пользователя
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы