2017-08-25 3 views
0

Ich muss ein Passwort von meinem "Reset-Passwort" -Code Hash. Der offensichtliche Weg, es zu tun ist veraltet:Erstellen Sie einen Passwort-Hash von Modell

class ResetPasswordsController { 
    public function reset() { 
     $this->ResetPassword->changePassword('correct horse battery staple'); 
    } 
} 

class ResetPassword { 
    public function changePassword ($password) { 
     $hash = AuthComponent::password($password); 
    } 
} 

class AuthComponent extends Component { 
    public static function password($password) { 
     return Security::hash($password, null, true); 
    } 
} 

... und es nicht sowieso arbeiten, weil ich ein benutzerdefiniertes Kennwort Hasher bin mit, von denen AuthComponent::password() ist offensichtlich nicht bewusst.

Kommentare sagt:

3.0.0 Seit 2.4 @deprecated. Verwenden Sie Security :: hash() direkt oder ein Passwort hasher Objekt.

... aber ich kann nicht die Syntax herauszufinden, meine Hasher zu nennen:

class CustomPasswordHasher extends AbstractPasswordHasher { 
} 

... esp. wenn ich App-Einstellungen berücksichtigen wollen:

class AppController extends Controller { 
    public $components = array(
     'Auth' => array(
      'authenticate' => array(
       'Custom' => array(
        'passwordHasher' => array(
         'className' => 'Foo', 
         'cost' => 10, 
        ), 
        'userModel' => 'MyUserModel', 
        'fields' => array(
         'username' => 'my_username_column', 
         'password' => 'my_auth_token_column' 
        ), 
       ) 
      ), 
     ), 
    ); 
} 

Gibt es eine Instanz der Hasher irgendwo verhakt entweder Controller oder Modell? Irgendeine Idee?

Antwort

0

ich einen Mechanismus gefunden, die zu funktionieren scheint:

class ResetPasswordsController { 
    public function reset() { 
     if (!$this->Auth->_authenticateObjects) { 
      $this->Auth->constructAuthenticate(); 
     } 
     $passwordHasher = $this->Auth->_authenticateObjects[0]->passwordHasher(); 
     $this->ResetPassword->changePassword('correct horse battery staple', $passwordHasher); 
    } 
} 

class ResetPassword { 
    public function changePassword ($password, AbstractPasswordHasher $passwordHasher) { 
     $hash = $passwordHasher->hash($password); 
    } 
} 

Die tricky Bit ist, dass es scheint, keine Instanz der AuthComponent, wahrscheinlich, weil die Passwort zurücksetzen nicht ist passwortgeschützt. Jedoch kann ich es selbst mit AuthComponent::constructAuthenticate() instanziieren.

0

In CakePHP 3.X Sie

dies in Modell/Entity/User.php tun können
protected function _setPassword($password) 
{ 
    if(strlen($password) > 0) 
    { 
     return (new DefaultPasswordHasher)->hash($password); 
    } 
} 

https://book.cakephp.org/3.0/en/controllers/components/authentication.html#hashing-passwords

+0

Dies sollte auch in CakePHP/2 funktionieren, aber es codiert sowohl die Hasher-Klasse als auch ihre Konfiguration. Es ist in Ordnung als ein schneller Hack, aber es ist nicht besonders robust. –

Verwandte Themen