2017-04-22 96 views
2

在爲站點設置「更改密碼」功能時,我有一個輔助密碼輸入(,在需要再次輸入密碼之前,您可以更改密碼)。如何比較Symfony 3中的密碼(Bcrypt哈希)?

我需要能夠檢查用戶當前的密碼(使用Bcrypt進行散列處理)與輸入的密碼。

在我的控制器動作,我有:

$currentPassword = $request->request->get('password'); 
$encoder = $this->container->get('security.password_encoder'); 
$encodedPassword = $encoder->encodePassword($user, $currentPassword); 

if($encodedPassword == $user->getPassword()) { // these don't ever match. 
    // ... 
} 

encodePassword(...)產生已輸入密碼的摘要,但它是不一樣的保存密碼(明文相同),所以我認爲正在應用不同的鹽,因此產生不匹配。

由於Bcrypt將salt合併到密碼摘要中,因此我沒有將它保存在任何地方。

如何檢查輸入的明文密碼是否與Symfony 3中存儲的Bcrypt摘要相匹配?我不使用FOSUserBundle

回答

5

可以使用編碼器服務的isPasswordValid方法所存儲的一個比較$currentPassword密碼:

$encoderService = $this->container->get('security.password_encoder')

,然後再通過用戶對象作爲該方法的第一個參數:

$match = $encoderService->isPasswordValid($userObject, $currentPassword)

如果比較匹配則返回true otherwi或false otherwi SE。

+0

太棒了。非常感謝。我不知何故在文檔中錯過了這一點。 – 121c

+1

很高興幫助@Chris。 PS:有時可以檢查類方法(使用ides快捷鍵)來查找對未來有用的內容:-) –