2013-02-05 91 views
3

我试图在Yii中实现phpass认证,但每次都失败。我一直在阅读很多SO文章,还没有找到解决方案,所以我认为这必须是Yii的特定问题。phi认证在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') 

我检查,以确保哈希密码是不是在插入数据库截断,这是不...我已经调整了我的密码字段为varchar 60按照另一个SO文章,并没有帮助...

编辑:似乎如果我手动将哈希粘贴到数据库字段,身份验证后生成它通过:

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

回答

3

问题可能在beforeSave。你散列user_pass每个你保存用户。如果您保存两次用户,您的密码将被散列两次,因此无用。

我使用phpass与yii没有问题,但我只哈希密码,如果它由用户手动设置。

尝试只有在用户修改/设置时才哈希密码。

+1

你是对的''beforeSave'是问题,我把它包装在'$ this-> scenario =='register''中,现在它完美地工作了 – keeg

+0

对这种情况使用场景的好主意 – 2013-02-05 20:56:59