编程语言
首页 > 编程语言> > CakePHP-无法使用Blowfish Auth登录用户

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