2017-03-16 5 views
1

Der Algorithmus funktioniert, aber sobald das Kennwort in Hash konvertiert und in der Datenbank gespeichert wurde, wird es nicht auf die Homepage umgeleitet. Stattdessen wird auf die Anmeldeseite umgeleitet, dass die Anmeldedaten falsch sind. Aber wenn ich versuchte, mich anzumelden, ist es in Ordnung. Was mache ich falsch?Fehler beim Migrieren von md5 zu Hash in Laravel

AuthenticatesUsers.php

protected function attemptLogin(Request $request) 
{ 
    $check = $this->guard()->attempt(
     $this->credentials($request), $request->has('remember') 
    ); 
    if ($check === false) 
    { 
     $user = User::where('username','=',$request->input('username'))->first(); 

     if(isset($user)) { 
      if($user->password == md5($request->input('password'))) { // If their password is still MD5 
       $hashed_password = Hash::make($request['password']); // Convert to new format 
       $user->password = $hashed_password; 
       $user->save(); 

       return $this->guard()->attempt(
        array(
         'username'=>$request->input('username'), 
         'password'=>$hashed_password 
        ), $request->has('remember') 
       ); 

      } else { 
       // Redirect to the login page. 
       return false; 
      } 
     } 
    } 
    return $check; 
} 
+0

Sie stellen sich also vor, dass sich der Benutzer mit 'md5 hashed password' anmelden könnte? –

+0

yup, coz ich ersetze die aktuelle md5 in laravel's hash. Aber das Problem ist danach. – EatCodePlaySleep

+0

Sie müssen also das vorhandene md5 Passwort in Ihrer Datenbank in 'Laravel Hashing' konvertieren? Wenn ja, versuchen Sie 'if (password_verify ($ request-> input ('password'), $ user-> password)' stattdessen zu sagen. –

Antwort

2

attempt nimmt nicht das Hash-Passwort, dauert es das Passwort, das Sie von dem Benutzer erhalten würden (das Klartext-Passwort). Der Benutzer kennt die Hash-Version seines Passworts nicht und attempt führt einen Hash-Check durch, der die reine Textversion erfordert.

Sie müssen das zweite Mal auch nicht attempt anrufen, wenn Sie den Benutzer und seine Anmeldeinformationen bereits validiert haben und über eine Benutzerinstanz verfügen, die sie darstellt. Verwenden Sie einfach login, um sie an diesem Punkt einzuloggen. Sie müssen nicht durch attempt gehen, die gerade die Datenbank requery wird, um den Benutzer zu erhalten, dann überprüfen Sie den Hash, den Sie wissen, ist richtig, seit Sie es nur einstellen.

Zu einem gewissen Grad Teil des Codes, den Sie haben, ist nur das, was attempt intern tut.

Auch müssen Sie die Datenbank nicht selbst für den Benutzer abfragen. Dieser erste Aufruf an attempt wird den "Benutzer" enthalten haben, den er bei der Abfrage der Datenbank gefunden hat. Sie können sie vom Guard abrufen, damit Sie die Datenbank nicht erneut abfragen müssen, $this->guard()->getLastAttempted().

Wenn Sie diese Änderungen vornehmen, wird das Problem "schlechte Anmeldeinformationen" beim zweiten Aufruf attempt entfernt, da es nicht mehr aufgerufen wird. Dadurch werden Ihre Abfragen von 3 Auswahlmöglichkeiten und 1 Aktualisierung auf 1 Auswahl und 1 Aktualisierung reduziert. (ungefähr)

+0

Ich sehe, danke für die Erklärung Mann, hier ist, was ich getan habe, nachdem Sie es in der Datenbank gespeichert. \t \t \t \t '$ Anfrage-> Sitzung() -> regenerate(); \t \t \t \t $ this-> clearLoginAttempts ($ Anfrage); \t \t \t \t Authentifizierung :: login ($ user, true); ' – EatCodePlaySleep