2015-01-09 56 views
1

我用security.yml配置密碼加密使用的加密設置:Symfony2的安全性:在代碼

encoders: 
    Acme\UserBundle\Entity\User: 
     algorithm: bcrypt 
     cost: 10 

現在,我想在我的用戶實體在實體\ user.php的更新用戶密碼,這樣的地方,我應該有是這樣的:

$this->password = password_hash($password, PASSWORD_DEFAULT, ['cost' => 10]); 

但是讓我們想象一下,有時候有人會決定,例如加密成本值更改爲20,將更新security.yml。忘記自定義加密代碼很容易。

我可以在我的代碼中使用security.yml中的設置來使解決方案更加通用並且更易於使用嗎?

回答

1

直接從security.yml中提取東西並且你真的不想。您只能使用安全系統使用的相同密碼編碼器。

$encoderFactory = $this->get('security.encoder_factory'); 

$encoder = $encoderFactory->getEncoder($user); 

$passwordEncrypted = $encoder->encodePassword($passwordPlaintext,$user->getSalt()); 

可能考慮看看FOSUserBundle UserManager類。它有一些有用的技巧。

0

您不應在實體內手動編碼密碼。更好的辦法是讓實體完全不可知,並將編碼結果傳遞給setPassword()

然而,您仍然可以在實體外部手動執行此操作,例如在服務中,並且在這種情況下,最好從容器獲取密碼編碼器工廠服務(或者更好地注入它),而不是嘗試重現算法自己:

$encoder = $this->container->get('security.encoder_factory')->getEncoder($user); 
$user->setPassword($encoder->encodePassword('p4ssw0rd', $user->getSalt())); 

此外,使用Bcrypt一個額外的好處是,你可以隨時更改的成本,而無需擔心在同一時間更新數據庫中的所有密碼。它仍然可以使用舊設置來檢查密碼,例如,您可以使用下一次登錄時更強的安全設置來更新數據庫中的密碼。