CakePHP-无法使用Blowfish Auth登录用户
作者:互联网
我正在使用CakePHP构建Web应用程序.
我想使用bcrypt / Blowfish进行密码加密.
用户注册工作正常,包括使用bcrypt哈希密码.
但是以某种方式我以后无法登录-该应用程序说用户名/密码错误,但输入正确.
这是我有关授权的代码:
在AppController中设置身份验证组件:
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>
更新
我发现哈希字符串在每次登录尝试时都会改变-如何解决?盐可以随意吗?不幸的是,我没有在文档中找到任何相关内容
更新2
关于this post,在这种情况下更改哈希可能是正确的.
但是我认为,CakePHP会在尝试登录时自行管理使用正确的盐,对吗?
更新3
如下编辑BlowfishPasswordHasher类:
public function check($password, $hashedPassword) {
var_dump(Security::hash($password, 'blowfish', $hashedPassword));
return $hashedPassword === Security::hash($password, 'blowfish', $hashedPassword);
}
现在,我确保Auch组件对每个检查都使用相同的哈希.
但仍然-存储在我的数据库中的哈希与通过哈希器的check方法生成的哈希不同.有任何想法吗?
解决方法:
我发现了我的错误.
除了我的用户注册,我还实施了电子邮件验证.
在验证时,正在修改用户记录,并且对User-> save()的相应调用导致密码再次在beforeSave()中被散列.
因此,对我有用的是从上方使用我的beforeSave()代码,但仅在令牌字段为空的情况下才再次对密码字段进行哈希处理,以我为例,这只能在注册时发生,而不能在验证时或验证之后发生.
标签:cakephp,cakephp-2-4,php 来源: https://codeday.me/bug/20191029/1962937.html