@lenkagruzd

Каким образом проверить соответствие password и password_repeat с учетом хеширования пароля?

Доброго времени суток.
Застрял на моменте проверки повторно введенного пароля, с учетом хеширования. Выдает несоответствие.
Подробнее. Контроллер:
public function actionRegistration() {

        if (!Yii::$app->user->isGuest) {
            return $this->redirect('/');
        }

        $model = new User();

        if ($model->load(Yii::$app->request->post())) {
                if (!User::find()->where(['username' => $model->username])->limit(1)->all()) {
                    $model->setPassword($model->password);
                    if ($model->save()) {
                        $login = new LoginForm();
                        $login->username = $model->username;
                        $login->password = $model->password;
                        $login->login();
                        return $this->redirect('/page/contact');
                    } else {
                        Yii::$app->session->setFlash('er', "Произошла ошибка, введите данные повторно.");
                    }
                } else {
                    Yii::$app->session->setFlash('exist', "Пользователь с таким именем существует.");
                }
        }

        return $this->render('registration', compact('model'));
    }

В модели User.

public function rules()
    {
        return [
            ['username', 'required', 'message' => 'Поле является обязательным.'],
            ['password', 'required', 'message' => 'Поле является обязательным.'],
            ['username', 'unique', 'message' => 'Пользователь с таким логином существует.'],
            ['password', 'string', 'min' => 6],
            ['password_repeat', 'required'],
            ['password_repeat', 'compare', 'compareAttribute'=> 'password'],
            [['created_at', 'invite'],  'safe'],

        ];
    }


public function setPassword($password) {
        $this->password = Yii::$app->security->generatePasswordHash($password);
    }

    public function validatePassword($password)
    {
        return Yii::$app->security->validatePassword($password, $this->password);
    }


Что я получаю на выходе:
1) Пароль хешируется на этапе setPassword
2) Повторный пароль остается без хеширования.
3) Сравнение не проходит.

Какие глупости пробовал:
1) Хешировал password_repeat и сравнивал c password. Логично, что ничего не получилось.
2) Кружил вокруг validatePassword, но ничего не получил. Видимо совсем закружился.
  • Вопрос задан
  • 202 просмотра
Пригласить эксперта
Ответы на вопрос 1
slo_nik
@slo_nik Куратор тега Yii
Добро утро.
public function validatePassword($password)
    {
        return Yii::$app->security->validatePassword($password, $this->password_hash);
    }

    public function setPassword($password) 
    {
        $this->password_hash = Yii::$app->security->generatePasswordHash($password);
    }

Это можно перенести в правила rules()
} else {
   Yii::$app->session->setFlash('exist', "Пользователь с таким именем существует.");
}

Соответственно такая проверка не нужна
if (!User::find()->where(['username' => $model->username])->limit(1)->all()) {
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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