0

パスワードをリセットしようとしているフォームがあります。password、changepassword、re-enterpassword の 3 つのフィールドがあります。

まず、パスワード フィールドがデータベースのパスワードと一致するかどうかを確認する必要があります。

ユーザーのサインアップ中に、ランダムなパスワードを生成し、そのパスワードをデータベースに保存するデフォルトの Yii2 機能を使用しました。また、ユーザーのログイン中にデフォルトのログイン機能を使用しました。

そして今、パスワードを検証するために、ログインで使用されるのと同じデフォルトの Yii2 検証を使用しようとしています。しかし、それはうまく機能していません。$user->validate() を使用してコントローラーをエコーし​​てチェックインすると、常に検証が true になります。これは、以下のコードで確認できます。

フォームがあるview resetProfilePassword.phpがあります

    <?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?>
    <?php  
    echo $form->field($resetpasswordmodel, 'password');
    echo $form->field($resetpasswordmodel, 'changepassword');
    echo $form->field($resetpasswordmodel, 'reenterpassword');
    ?>
    <div class="form-group">
        <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
    </div>
    <?php ActiveForm::end(); ?>

私はmodel resetProfilePasswordForm.phpを持っています

  <?php
    namespace frontend\models;
    use common\models\User;
    use yii\base\Model;

    class ResetProfilePasswordForm extends Model
    {
      public $password;
      public $changepassword;
      public $reenterpassword;

      public function rules()
       {
        return [

        ['password', 'validatePassword'],
        ['changepassword', 'required'],
        ['reenterpassword', 'required'],
        ['reenterpassword', 'compare', 'compareAttribute'=>'changepassword', 'message'=>"Passwords don't match" ]
        ];
      }

public function attributeLabels()
{
    return [
        //'user_profile_id' => 'User Profile ID',
        //'user_ref_id' => 'User Ref ID',
        'password' => 'Password',
        'changepassword' => 'Change Password',
        'reenterpassword' => 'Re-enter Password',
        ];
       }

     public function validatePassword($attribute, $params)
     {
      if (!$this->hasErrors()) {
        $user = $this->getUser();
        if (!$user || !$user->validatePassword($this->password)) {
            $this->addError($attribute, 'Incorrect username or password.');
         }
        }
       }

      protected function getUser()
      {
        if ($this->_user === null) {
          $this->_user = User::findByUsername($this->username);
        }

        return $this->_user;
        }

    }

これはcontroller ProfileController.php です

 public function actionResetProfilePassword()
   {
    $resetpasswordmodel = new ResetProfilePasswordForm();
    if ($resetpasswordmodel->load(Yii::$app->request->post())) {

        $user = User::find()->where(['id' => Yii::$app->user->identity->id])->one();
        if($user->validate()){
        $user->save(false);
        }
     }
             return $this->render('ResetProfilePassword', [
            'resetpasswordmodel' => $resetpasswordmodel
            ]);
     }

私が問題に直面している場所で私を助けてください。これが正しい検証方法でない場合は、パスワードを検証するためのより良い方法を提供するのを手伝ってください

4

2 に答える 2

1

resetpasswordmodel検証を適用するには、validate()メソッドを実行してから、次のようにユーザー モデルを更新します。

public function actionResetProfilePassword()
{
    $resetpasswordmodel = new ResetProfilePasswordForm();
    if ($resetpasswordmodel->load(Yii::$app->request->post())) {
        $user = User::find()->where(['id' => Yii::$app->user->identity->id])->one();
        # here we run our validation rules on the model
        if ($resetpasswordmodel->validate()) {
            # if it is ok - setting the password property of user
            $user->password = $resetpasswordmodel->changepassword;
            # and finally save it
            $user->save();
     }
     return $this->render('ResetProfilePassword', [
         'resetpasswordmodel' => $resetpasswordmodel
     ]);
}
于 2016-04-12T09:46:21.083 に答える