phpass身份验证在Yii中失败


phpass authentication fails in Yii

我试图在Yii中实现phpass身份验证,但每次都失败了。我读了很多SO的文章,还没有找到解决方案,所以我认为这一定是Yii的特定问题。

在User.php中,我正在保存散列密码:

public function beforeSave() {
    $phpass = new PasswordHash(8, false);
    $hash = $phpass->HashPassword($this->user_pass);
    $this->user_pass = $hash;
    return true;
}

在UserIdentity中,我正在检查密码:

public static function isPasswordValid($plainPass, $hashedPass) {
    $phpass = new PasswordHash(8, false);
    $isValid = $phpass->CheckPassword($plainPass, $hashedPass);

    if($isValid){
        return true;
    }
    return false;
}

$hashedPass从数据库中出来,plainPass是用户刚刚输入表单的内容,但$isValid一直返回false。事实上,我从数据库中取出了散列密码,并手动应用了它,但它仍然失败:

$isValid = $phpass->CheckPassword('password', '$2a$08$P9X8duz7S8LOysz1XIn3fe/YYW3dwAs2busSBIX/QnZhKH/R9/H1S')

我已经检查过,以确保哈希密码在插入时不会在数据库中被截断,也不会。。。根据另一篇SO文章,我已经将我的密码字段调整为varchar 60,但这并没有帮助。。。

编辑:似乎如果我手动将散列粘贴到数据库字段中,那么通过生成散列后,身份验证就可以工作了

echo $phpass->HashPassword('password');

问题可能在beforeSave中。每次保存用户时,您都要散列user_pass。若您保存用户两次,您的密码将被散列两次,因此毫无用处。

我使用phpass和yii没有问题,但我只散列密码,如果它是由用户手动设置的。

只有当用户修改/设置密码时,才尝试散列密码。