从模型创建密码哈希
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()
.
实例化它
我需要从我的 "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()
.