@bighoc
php/javascript developer

Как правильно сохранять пароль в Yii2?

Проблема:
В моей таблице User есть поле password_hash.
Я создаю форму в которой юзер сможет менять себе имя емейл и пароль.
Выводя эту форму я не хочу показывать юзеру текущий пароль( тем более его хеш ).
По этому я создал в моделе два свойства

public $password;
    public $password_repeat;
function rules(){
return [ ['password_repeat', 'compare', 'compareAttribute' => 'password']];
}

Вот моя форма
<?php $form = ActiveForm::begin(); ?>


        <?= $form->field($user, 'username') ?>
        <?= $form->field($user, 'email') ?>
        <?= $form->field($user, 'password')->passwordInput() ?>
        <?= $form->field($user, 'password_repeat')->passwordInput() ?>

        <div class="form-group">
            <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
        </div>
    <?php ActiveForm::end(); ?>

Что бы всё это хорошо работало мне пришлось сделать вот что в контроллере:
$user_id = Yii::$app->getUser()->id;
        $user = User::findOne($user_id);
        $post = Yii::$app->request->post();
        if(isset($post['User']['password'])){
            $user->setPassword(Yii::$app->request->post('password'));
            unset($post['User']['password']);
            unset($post['User']['password_repeat']);
        }
        if ($user->load($post) && $user->validate()) { .....

Мне приходиться использовать ансет , в другом случае я получаю ошибку "Password must be repeated exactly." (хотя и ввожу два одинокавых пароль).

Всё это больно похоже на вилосипед.
Вопрос:
Как сделать эту операцию правильно ?

Спасибо
  • Вопрос задан
  • 3680 просмотров
Пригласить эксперта
Ответы на вопрос 1
LIAL
@LIAL
А зачем вам вот это все: ?
if(isset($post['User']['password'])){
            $user->setPassword(Yii::$app->request->post('password'));
            unset($post['User']['password']);
            unset($post['User']['password_repeat']);
        }


По идее оно лищнее, у вас описано правило валидации, и оно сработает в if. Если все нормально попадете внутрь if

И еще попрбуйте заменить правило валидации на такое:
['password', 'compare']
тк судя по описанию https://github.com/yiisoft/yii2/blob/master/docs/g...
// validates if the value of "password" attribute equals to that of "password_repeat"
['password', 'compare'],

этого должно быть достаточно
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы