Я пытаюсь изменить пароль в расширенном приложении 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 сказал)