Yii2自动更改用户密码

时间:2018-07-23 08:19:07

标签: yii2

我有一个名为user的模型。此模型具有passwordmedia_id和许多其他属性。

我想使用此方法更改单个属性:

$user = User::find()
            ->where([
                "id" => $id
            ])
            ->one();
        $user->media_id = null;
        if($user->save()){
            return [
                "ok" => true
            ];
        }
        else{
            return [
                "ok" => false,
                "result" => $user->errors
            ];
        }

但是当我运行此代码时,密码字段将更改为未知值,因此用户无法再登录。

但是当我使用以下方法时:

User::updateAll([
            "media_id" => null
        ],
            [
                "id" => $id
            ]);

我的查询正常工作。第一个代码有什么问题?

UPDATE1:

这是规则:

public function rules() {
        return [
                ['password', 'required', 'message' => 'لطفا کلمه عبور خود را وارد نمایید', 'on' => 'register'],
                ['email', 'required', 'message' => 'لطفا ایمیل خود را وارد نمایید', 'on' => 'register'],
                ['email', 'duplicateEmail', 'message' => 'لطفا ایمیل خود را وارد نمایید', 'on' => 'register'],
                ['email', 'validateRegisterEmail', 'message' => 'لطفا ایمیل خود را وارد نمایید', 'on' => 'register'],
                ['email', 'required', 'message' => 'لطفا ایمیل خود را وارد نمایید', 'on' => 'changeEmail'],
                ['email', 'duplicateEmail', 'message' => 'لطفا ایمیل خود را وارد نمایید', 'on' => 'changeEmail'],
                ['email', 'validateRegisterEmail', 'message' => 'لطفا ایمیل خود را وارد نمایید', 'on' => 'changeEmail'],
//            [['code', 'first_name', 'last_name', 'gender', 'mobile', 'email', 'password', 'bio', 'degree', 'favorites', 'type', 'active', 'active_mobile', 'active_email', 'modified_password', 'created', 'modified', 'deleted'], 'required'],
                [['gender', 'media_id', 'cover_media_id', 'type', 'active', 'active_mobile', 'active_email', 'deleted'], 'integer'],
                [['degree', 'bio', 'favorites'], 'string'],
                [['modified_password', 'created', 'modified'], 'safe'],
                [['code'], 'string', 'max' => 10],
                [['forget_password_token'], 'string', 'max' => 32],
                [['first_name', 'last_name', 'email'], 'string', 'max' => 50, 'message' => 'تعداد کاراکتر بیش از حد مجاز می باشد'],
                [['mobile'], 'string', 'max' => 12, 'message' => 'تعداد کاراکتر بیش از حد مجاز می باشد'],
                [['password'], 'string', 'max' => 20, 'message' => 'تعداد کاراکتر بیش از حد مجاز می باشد', 'on' => 'register'],
                [['media_id'], 'exist', 'skipOnError' => true, 'targetClass' => Media::className(), 'targetAttribute' => ['media_id' => 'id']],
                [['cover_media_id'], 'exist', 'skipOnError' => true, 'targetClass' => Media::className(), 'targetAttribute' => ['cover_media_id' => 'id']],
                ['type', 'default', 'value' => 1],
                ['type', 'in', 'range' => [self::ROLE_USER, self::ROLE_INSTRUCTOR, self::ROLE_AUTHOR, self::ROLE_MANAGER, self::ROLE_INVESTOR]],
        ];
    }

我已经测试过save(false),但仍然更改了密码。

我还测试了model.validate(),并且密码没有更改。

密码仅在我运行model.save()时更改。

这是我的model

1 个答案:

答案 0 :(得分:2)

public function beforeSave($insert) {
  if (parent::beforeSave($insert)) {
      // Place your custom code here
      if (!$this->notChangePassword)
          $this->setPassword($this->password);
      return true;
  }
}

这是原因。 $notChangePasswordnull的默认设置,因此将在每个$this->setPassword($this->password)上调用save()(并散列已散列的密码)。

我建议不要对原始密码和哈希密码使用相同的属性。您可以引入$rawPassword属性,并以表格的形式代替$password

class User extends ActiveRecord implements IdentityInterface {

    public $rawPassword;

    public function beforeSave($insert) {
        if (parent::beforeSave($insert)) {
            if (!empty($this->rawPassword)) {
                $this->setPassword($this->rawPassword);
            }
            return true;
        }
    }

    // ...
}