2015-11-12 15 views
1

我在我的應用程序中實現了ZfcUser。問題是即使密碼正確,驗證也會失敗。ZfzUser身份驗證始終失敗

我已經深入瞭解了這個問題。我注意到的是,應用程序從密碼中檢索密碼哈希並將其傳遞給Bcrypt驗證方法。

下面是Zend的

代碼
if (!$bcrypt->verify($credential, $userObject->getPassword())) { 
    // Password does not match 
    $e->setCode(AuthenticationResult::FAILURE_CREDENTIAL_INVALID) 
     ->setMessages(array('Supplied credential is invalid.')); 
    $this->setSatisfied(false); 
    return false; 
} 

現在bcrypt驗證方法的工作原理如下。

public function verify($password, $hash) 
{ 
    $result = crypt($password, $hash); 
    return Utils::compareStrings($hash, $result); 
} 

我的密碼是'admin123',在數據庫中保存它生成的散列"$2y$14$9QsDD3.T3xwCnZsMsiBft.fwLewL.0L5pyViAJY0EbNz0ECIGDi5u"

,但我看到它永遠不會匹配,因爲驗證方法使用的哈希值鹽。我做錯了什麼,或者框架中有一些錯誤/?

在我的用戶實體用於設置密碼的代碼是

public function setPassword($password) 
{ 
    $bcrypt = new Bcrypt(); 
    $bcrypt->setCost(14); 
    $this->password = $bcrypt->create($password); 
} 
+0

可能的[Zend \ Crypt \ Password \ BCrypt驗證方法]重複(http://stackoverflow.com/questions/32717509/zend-crypt-password-bcrypt-verify-method) – Wilt

回答

0

我問究竟the same question here

事實證明,crypt可以使用散列。它會把它分解成可用的部分,然後將它的相應部分用作鹽,所以將整個散列作爲第二個參數傳遞沒有問題。

你真的嘗試過嗎?難道問題在別的地方嗎?

+0

也許那麼我存儲密碼以錯誤的方式在數據庫中,因爲結果散列不同於db中的密碼。我已將原始文章中的代碼包含在密碼生成中以保存在數據庫中。請看看它是正確的。 –

+0

@backTangent立即創建密碼後,請嘗試:'$ bcrypt-> verify($ password,$ this-> password);' – Wilt

+0

@backTangent並且解決了嗎? – Wilt