从模型创建密码哈希

Create password hash from model

我需要从我的 "reset password" 代码中散列密码。显而易见的方法已被弃用:

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

...而且无论如何它都不起作用,因为我使用的是自定义密码哈希器,其中 AuthComponent::password() 显然不知道。

评论说:

@deprecated 3.0.0 Since 2.4. Use Security::hash() directly or a password hasher object.

...但我无法弄清楚调用我的散列器的语法:

class CustomPasswordHasher extends AbstractPasswordHasher {
}

... 特别是。如果我想考虑应用设置:

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

在控制器或模型的某处是否有 hasher 的实例? 有什么想法吗?

在 Cakephp 3.X 中,您可以在 Model/Entity/User 中执行此操作。php

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

我发现了一个似乎有效的机制:

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

棘手的一点是似乎没有 AuthComponent 的实例,可能是因为 重置密码 页面没有密码保护。但是,我可以自己用 AuthComponent::constructAuthenticate().

实例化它