我正在使用CakePHP构建一个Web应用程序。 我想使用bcrypt / Blowfish进行密码加密。 用户注册工作正常,包括使用bcrypt散列密码。 但不知怎的,我以后无法登录 - 应用程序说用户名/密码错误但输入正确。
这是关于授权的代码:
AppController中的Auth组件设置:
public $components = array(
'Session',
'Auth' => array(
'loginAction' => array(
'controller' => 'users',
'action' => 'login'
),
'authenticate' => array(
'Form' => array(
'userModel' => 'User',
'passwordHasher' => 'Blowfish'
)
)
)
);
型号代码:
public $validate = array(
'username' => array(
'alphaNumeric' => array(
'rule' => 'alphaNumeric',
'required' => true,
'message' => 'Alphanumeric characters only'
)
),
'email'=> 'email',
'password' => array(
'lengthrule' => array(
'rule' => array('minLength', '8'),
'message' => 'Minimum 8 characters'
)
)
);
public function beforeSave($options = array()) {
parent::beforeSave();
$passwordHasher = new BlowfishPasswordHasher();
$this->data['User']['password'] = $passwordHasher->hash(
$this->data['User']['password']
);
if(empty($this->data[$this->alias]['token'])) {
$this->data[$this->alias]['token'] = md5(
$this->data[$this->alias]['username'] .
$this->data[$this->alias]['email'] .
$this->data[$this->alias]['created']
);
}
return $this->data;
}
我的控制器中的登录操作:
public function login() {
if ($this->request->is('post')) {
if ($this->Auth->login()) {
return $this->redirect(array('controller' => 'users', 'action' => 'edit'));
}
$this->Session->setFlash(__('Invalid username or password, try again'));
}
}
最后是元素,我正试图从以下地址登录:
<div class="users form">
<?php echo $this->Session->flash('auth'); ?>
<?php echo $this->Form->create('User', array('url' => '/users/login')); ?>
<fieldset>
<legend>
<?php echo __('Login :)'); ?>
</legend>
<?php echo $this->Form->input('username');
echo $this->Form->input('password');
?>
</fieldset>
<?php echo $this->Form->end(__('Login')); ?>
<small>no account yet?</small><br />
<?php echo $this->Html->link(__('Register'), '/users/register'); ?>
</div>
更新
我发现哈希字符串会随着每次登录尝试而改变 - 这怎么能解决?盐是随机的吗?不幸的是,我在文档
UPDATE2
关于this post,在此上下文中,更改哈希可能是正确的。 但我想,CakePHP在尝试登录时管理使用正确的盐,对吗?
UPDATE3
按如下方式编辑BlowfishPasswordHasher类:
public function check($password, $hashedPassword) {
var_dump(Security::hash($password, 'blowfish', $hashedPassword));
return $hashedPassword === Security::hash($password, 'blowfish', $hashedPassword);
}
我现在确保Auch组件正在为每次检查使用相同的哈希值。 但是仍然 - 存储在我的数据库中的哈希与哈希的哈希检查方法生成的哈希不同。有什么想法吗?
答案 0 :(得分:2)
尝试使用自定义哈希,使用php-methods对您的密码进行哈希处理。请参阅有关新方法的php文档:
1.在模型的beforeSave()
上隐藏密码:
public function beforeSave()
{
$this->data['User']['password'] = password_hash(
$this->data['User']['password'],
PASSWORD_BCRYPT
);
return true;
}
2.在Auth
的{{1}}组件中定义自定义哈希:
AppController
3.在public $components = array(
'Session',
'Auth' => array(
'loginAction' => array(
'controller' => 'users',
'action' => 'login'
),
'authenticate' => array(
'Form' => array(
'userModel' => 'User',
'passwordHasher' => 'Custom'
)
)
)
);
:
app/Controller/Component/Auth/CustomPasswordHasher.php
多数民众赞成。适合我。
答案 1 :(得分:2)
我发现了我的错误。
除了我的用户注册,我还实施了电子邮件验证。 在验证时,正在修改用户记录,并且对User-&gt; save()的相应调用导致密码在beforeSave()中再次进行哈希处理。
那么对我有用的是使用上面的beforeSave()代码,但是如果令牌字段为空则只会再次散列密码字段,在我的情况下,只能在注册时发生,而不是在验证时或验证后。< / p>