Изменение пароля yii2 путем проверки текущего пароля с введенным паролем

Я пытаюсь изменить пароль в расширенном приложении yii2, но он всегда терпит неудачу

У меня есть модель, которая находит введенный пароль и проверяет его на сохраненный пароль, и если он верен, он возвращает true, но если false, он должен завершиться ошибкой.

Это модельная часть

Это то, что устанавливает пароль пользователя

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

Это то, что используется для сравнения двух паролей

  public function findPasswords($attribute, $params){ $user = UserIdentity::find()->where([ 'username'=>Yii::$app->user->identity->username ])->one(); $password = $user->password_hash; //returns current password as stored in the dbase $hash2 = Yii::$app->security->generatePasswordHash($this->oldpass); //generates an encrypted password if($password!= $hash2) { $this->addError($attribute, 'Old password is incorrect'); } } использованием  public function findPasswords($attribute, $params){ $user = UserIdentity::find()->where([ 'username'=>Yii::$app->user->identity->username ])->one(); $password = $user->password_hash; //returns current password as stored in the dbase $hash2 = Yii::$app->security->generatePasswordHash($this->oldpass); //generates an encrypted password if($password!= $hash2) { $this->addError($attribute, 'Old password is incorrect'); } } данных  public function findPasswords($attribute, $params){ $user = UserIdentity::find()->where([ 'username'=>Yii::$app->user->identity->username ])->one(); $password = $user->password_hash; //returns current password as stored in the dbase $hash2 = Yii::$app->security->generatePasswordHash($this->oldpass); //generates an encrypted password if($password!= $hash2) { $this->addError($attribute, 'Old password is incorrect'); } } 

Это всегда возвращает старый пароль неверно. Я также пробовал

 var_dump(Yii::$app->security->generatePasswordHash(5378)); var_dump(Yii::$app->security->generatePasswordHash(5378)); 

Два из них возвращают два разных значения, почему это так?

Что может быть неправильно?

ЭТО ПОЛНАЯ МОДЕЛЬ ПОЛЬЗОВАТЕЛЯ ПОСЛЕ ОБНОВЛЕНИЯ. Теперь появляется ошибка получения неизвестного свойства: app \ models \ UserPass :: password_hash

 class UserPass extends Model{ public $oldpass; public $newpass; public $repeatnewpass; public function rules(){ return [ [['oldpass','newpass','repeatnewpass'],'required'], ['oldpass','findPasswords'], ['repeatnewpass','compare','compareAttribute'=>'newpass'], ]; } public function findPasswords($attribute, $params){ $user = UserIdentity::find()->where([ 'username'=>Yii::$app->user->identity->username ])->one(); $valid = $this->validatePassword("53785378"); var_dump(validatePassword("53785378")); die(); $password = $user->password_hash; //returns current password as stored in the dbase $hash2 = Yii::$app->security->generatePasswordHash($this->oldpass); //generates an encrypted password if($password!= $hash2) { $this->addError($attribute, 'Old password is incorrect'); } } public function attributeLabels(){ return [ 'oldpass'=>'Old Password', 'newpass'=>'New Password', 'repeatnewpass'=>'Confirm Password', ]; } public function validatePassword($password) { return Yii::$app->security->validatePassword($password, $this->password_hash); } } использованием class UserPass extends Model{ public $oldpass; public $newpass; public $repeatnewpass; public function rules(){ return [ [['oldpass','newpass','repeatnewpass'],'required'], ['oldpass','findPasswords'], ['repeatnewpass','compare','compareAttribute'=>'newpass'], ]; } public function findPasswords($attribute, $params){ $user = UserIdentity::find()->where([ 'username'=>Yii::$app->user->identity->username ])->one(); $valid = $this->validatePassword("53785378"); var_dump(validatePassword("53785378")); die(); $password = $user->password_hash; //returns current password as stored in the dbase $hash2 = Yii::$app->security->generatePasswordHash($this->oldpass); //generates an encrypted password if($password!= $hash2) { $this->addError($attribute, 'Old password is incorrect'); } } public function attributeLabels(){ return [ 'oldpass'=>'Old Password', 'newpass'=>'New Password', 'repeatnewpass'=>'Confirm Password', ]; } public function validatePassword($password) { return Yii::$app->security->validatePassword($password, $this->password_hash); } } данных class UserPass extends Model{ public $oldpass; public $newpass; public $repeatnewpass; public function rules(){ return [ [['oldpass','newpass','repeatnewpass'],'required'], ['oldpass','findPasswords'], ['repeatnewpass','compare','compareAttribute'=>'newpass'], ]; } public function findPasswords($attribute, $params){ $user = UserIdentity::find()->where([ 'username'=>Yii::$app->user->identity->username ])->one(); $valid = $this->validatePassword("53785378"); var_dump(validatePassword("53785378")); die(); $password = $user->password_hash; //returns current password as stored in the dbase $hash2 = Yii::$app->security->generatePasswordHash($this->oldpass); //generates an encrypted password if($password!= $hash2) { $this->addError($attribute, 'Old password is incorrect'); } } public function attributeLabels(){ return [ 'oldpass'=>'Old Password', 'newpass'=>'New Password', 'repeatnewpass'=>'Confirm Password', ]; } public function validatePassword($password) { return Yii::$app->security->validatePassword($password, $this->password_hash); } } 

Используйте метод validatePassword вместо генерации хеша пароля из значения ввода и сравнения хэшей. Это метод из модели User который расширяет ActiveRecord :

 /** * Validates password * * @param string $password password to validate * @return boolean if password provided is valid for current user */ public function validatePassword($password) { return Yii::$app->security->validatePassword($password, $this->password_hash); } 

Вы должны использовать validatePassword вместо сравнения хэшей точно так же, как сказал @simialbi, но чтобы ответить на ваш вопрос о том, почему это возвращает другой результат.

 Yii::$app->security->generatePasswordHash(5738); 

Процесс генерации хеша требует создания случайной соли, которая будет приводить к разным результатам каждый раз, ссылки на документацию

изменение

 $hash2 = Yii::$app->security->generatePasswordHash($this->oldpass); if($password!= $hash2) { $this->addError($attribute, 'Old password is incorrect'); } 

в

 $validateOldPass = Yii::$app->security->validatePassword($this->oldpass,$password); if(!$validateOldPass) { $this->addError($attribute, 'Old password is incorrect'); } 

Вам нужно использовать метод validatePassword вместо генерации нового хэша (согласно @simialbi сказал). Сгенерированный хэш-хард каждый раз, когда он создается, таким образом делает ваше сравнение между старыми хэшированными старыми и хешированными старыми ошибками. (согласно @mhyassin сказал)