CakePHP - 无法使用Blowfish Auth登录用户

时间:2014-03-02 10:50:13

标签: php cakephp cakephp-2.4

我正在使用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组件正在为每次检查使用相同的哈希值。 但是仍然 - 存储在我的数据库中的哈希与哈希的哈希检查方法生成的哈希不同。有什么想法吗?

2 个答案:

答案 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>