2013-02-05 61 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