2016-08-09 27 views
0

Am Passwort ändert in yii2 erweitert App versucht, Kontrolle aber es funktioniert nicht immerÄndern yii2 Passwort durch das aktuelle Passwort mit dem eingegebenen Passwort

Ich habe ein Modell, das das eingegebene Passwort und prüft sie gegen das gespeicherte Passwort findet und wenn es ist wahr, es ist wahr, aber wenn es falsch ist, sollte es scheitern.

Dies ist Modellteil

Dies ist, was ein Benutzer-Passwort setzt

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

Dies ist, was die beiden Passwörter zu vergleichen verwendet wird

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'); 
      } 

    } 

Dieses immer alte Passwort falsch zurückgibt, ist . habe ich versucht, auch

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

Die beiden oben gibt zwei verschiedene Werte, warum es das?

Was könnte falsch sein ??

Dies ist das voll USER Modell nach Update Am nun einen Fehler des Erhaltens unbekannte Eigenschaft bekommen: app \ model \ 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); 
    } 


} 

Antwort

2

Verwenden Sie die validatePassword Methode anstelle der Erzeugung von Passwort-Hash von Eingabewert und vergleiche Hashes. Dies ist ein Verfahren aus User Modell, das ActiveRecord erweitert:

/** 
* 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); 
} 
+0

Ich habe es hinzugefügt, aber ich weiß, erhalten einen Fehler von Hash ist ungültig –

+0

Ich habe die Frage mit meinem neuen Fehler –

+0

aktualisiert Das Modell sollte die Benutzeridentität darstellen. Folgen Sie dem [guide] (http://www.yiiframework.com/doc-2.0/guide-index.html) von yii2, um zu erfahren, wie es genau funktioniert – simialbi

1

Sie die validatePassword statt Vergleich Hashes verwenden sollten, genau wie @simialbi gesagt, aber Ihre Frage zu beantworten, warum tut diese Rückkehr anderes Ergebnis.

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

der Prozess den Hash des Erzeugens erfordert ein zufälliges Salz zu erzeugen, die in verschiedenen Ausgangs jedesmal, Referenzen für documentation

+0

Ich habe die Frage mit meinem neuesten Fehler aktualisiert –

0

Änderung

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

zu

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

Sie führen Sie müssen die validatePassword-Methode verwenden, anstatt sie zu generieren neuer Hash (wie @simialbi sagte). Generierter Hash-Wert wird jedes Mal neu generiert, wenn er generiert wird. Dadurch wird der Vergleich zwischen neugehacktem Oldpass und Hashed-Oldpass fehlgeschlagen. (wie pro @ mhyassin sagte)

Verwandte Themen