从模型创建密码哈希

时间:2017-08-25 09:25:19

标签: cakephp cakephp-2.5

我需要从我的"重置密码"哈希密码码。这种显而易见的方法已被弃用:

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 2.4以来。直接使用Security :: hash()或密码hasher对象

...但我无法弄清楚调用我的哈希的语法:

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

是否有一个哈希的实例在控制器或模型中某处挂钩? 有什么想法吗?

2 个答案:

答案 0 :(得分:0)

在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

答案 1 :(得分:0)

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

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()自己实例化它。