2016-03-18 8 views
0

Ich verschiebe eine App von CakePHP 2 nach CakePHP 3. Es gibt einen neuen Hashalgorithmus für Cake3. Ich möchte, dass die vorhandenen Benutzer sich mit ihren alten Passwörtern in der App anmelden können und diese Passwörter dann auf den neuen Algorithmus aktualisiert werden.Migrieren von CakePHP2-Authentifizierung zu CakePHP 3

Leider kann ich nicht den richtigen Hash abrufen, der mit dem in der Datenbank übereinstimmt.

$person = $this->Auth->identify(); 
if(!$person){ # maybe they have old sha1 password? 
    $oldhash = Security::hash($this->request->data['password'], 
          'sha1', "oldsalt");     
    $person = $this->People->find()->where(['password' => $oldhash])->where(['email' =>$this->request->data['email'] ])->first(); 
    if($person){ 
    $person->password = Security::hash($this->request->data['password']); 
    $this->People->save($person); 
    }    
} 

Der Benutzer nicht gefunden wird, und wenn ich die oldhash $ debug aus erhalte ich eine andere Zeichenfolge als das, was für den Benutzer im Passwort-Feld gespeichert wird.

Was mache ich falsch?

+0

werfen Sie einen Blick auf [diese] (http://book.cakephp.org/3.0/en/controllers/components/authentication.html#changing-hashing-algorithmen) – Sevvlor

Antwort

3

Fallback-Klassen

Nach dem documentation:

CakePHP bietet eine saubere Art und Weise Ihre Passwörter der Benutzer von einem Algorithmus zum anderen zu wandern, dies durch die FallbackPasswordHasher Klasse erreicht wird. Vorausgesetzt, dass Sie Ihre App von CakePHP 2.x migrieren, die Hashes SHA1-Passwort verwendet, können Sie die Auth Komponente wie folgt konfigurieren:

werden Sie haben eine Custom Password Hasher Klasse src/Auth/ erstellen. A Custom Passwort Hasher wil etwas wie folgt aussehen:

namespace App\Auth; 

use Cake\Auth\AbstractPasswordHasher; 

class LegacyPasswordHasher extends AbstractPasswordHasher { 

    public function hash($password) 
    { 
     return sha1($password); 
    } 

    public function check($password, $hashedPassword) 
    { 
     return sha1($password) === $hashedPassword; 
    } } 

und es dann in authenticate als fallback wie diese passwordhasher hinzufügen:

'authenticate' => [ 
       'Form' => [ 
        'passwordHasher' => [ 
         'className' => 'Fallback', 
         'hashers' => [ 
          'Default', 
          'Legacy' 
         ] 
        ] 
       ] 
      ] 

Der erste Name in der hashers Taste erscheint zeigt an, welche von Die Klasse ist die bevorzugte Klasse, sie wird jedoch auf die anderen Klassen in der Liste zurückgreifen, wenn die Prüfung nicht erfolgreich war.

legacy ist die Custom Password Hasher.

das Passwort aktualisiert

Um die Benutzer-Passwort auf den neuen Hash aktualisieren Sie diesen Code auf Ihre Login-Prozedur hinzufügen:

if ($this->Auth->authenticationProvider()->needsPasswordRehash()) { 
    $user = $this->Users->get($this->Auth->user('id')); 
    $user->password = $this->request->data('password'); 
    $this->Users->save($user); 
} 

Dokumentation

+0

Das ist wirklich gut, und erklärt es besser & expliziter für meinen Fall. Vielen Dank. Ich bin immer noch gegen das Problem, dass der SHA1 hat nicht die gleiche Hash-Version des Passworts wie das vorherige System, so dass Legacy-Konten können nicht – Will

+0

tatsächlich anmelden. Ist das so, weil cake2.x etwas anderes als sha1 benutzt? – Will

+0

oh nein, warte, es ist nicht wirklich durch die Standard-Legacy-Hasher-Code. – Will