Yii2更改用户';自动输入密码
我有一个名为Yii2更改用户';自动输入密码,yii2,Yii2,我有一个名为user的模型。此型号具有密码、媒体id和许多其他属性 我想使用此方法更改单个属性: $user = User::find() ->where([ "id" => $id ]) ->one(); $user->media_id = null; if($user->save()){ return [
user
的模型。此型号具有密码
、媒体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
]);
我的查询工作正常。第一个代码有什么问题
更新1:
这是规则:
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()时更改。
这是我的
这就是原因$notChangePassword
是null
的默认值,因此$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;
}
}
// ...
}
这就是原因$notChangePassword
是null
的默认值,因此$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;
}
}
// ...
}
您可能在验证规则或
beforeSave()
中有一些奇怪的魔力。在未经验证的情况下使用save函数,如$user->save(false)从您的user
模型中添加rules()
。您可能在验证规则或beforeSave()
中有一些奇怪的魔力。在未经验证的情况下使用save函数,如$user->save>(false)从您的用户
模型中添加规则()
。如果删除内部如果
,会发生什么?如果删除内部如果
,会发生什么?