2012-09-13 45 views
0

我嘗試了@Assert\MinLength,但它在編碼密碼時,似乎在每次都足夠長的時間內檢查。如何在編碼之前放置約束?如何在Symfony2中設置密碼長度限制?

我想不出有什麼更好的方法來計算綁定註冊表後strlen的符號數量,但我認爲這不是一個好方法。而且我也不確定即使這樣做會起作用,但我不確定何時完成編碼。

任何建議將不勝感激!先謝謝你!

+0

這可能是因爲您在調用isValid()方法之前對密碼進行了編碼。你在哪裏編碼你的密碼? – Cyprian

+0

我用一種方法對它進行編碼:'public function setPassword($ password) { $ this-> password = sha1($ password); }'這是在我的**用戶**類。 – Faery

回答

1

的問題是,你使用一個字段有兩個目的:採用明文存儲和編碼格式的密碼。你需要的是每個目的的領域:

use Symfony\Component\Validator\Constraints\NotBlank; 
use Symfony\Component\Validator\Constraints\MinLength; 
use Doctrine\ORM\Mapping\Column; 

class User 
{ 
    /** 
    * @NotBlank 
    * @MinLength(6) 
    * 
    * @var string 
    */ 
    private $plainPassword; 

    /** 
    * @Column 
    * 
    * @var string 
    */ 
    private $password; 
} 

只有$password字段保存到數據庫,它不是在形式顯示,使用戶不能編輯它。

此外,您還需要一個Doctrine事件偵聽器或其他代碼來檢查$plainPassword是否爲空,如果不是,則將其值編碼爲$password

使用security.encoder_factory服務獲取您在安全配置中設置的編碼器,並使用它編碼密碼。另外,請檢查我的ElnurBlowfishPasswordEncoderBundle

+0

非常感謝! :) – Faery

0

您不應該在密碼設置器中自己編碼。而不是使用某種編碼器(甚至可以編寫自己的編碼器),並在驗證表單後對密碼進行編碼。

下面是例如你如何使用編碼器:

http://symfony.com/doc/current/book/security.html#encoding-the-user-s-password

+0

謝謝!我知道'$ this-> password = sha1($ password);'是一個不好的習慣,但這只是對所有安全系統的練習,我也遇到過問題,所以我也不想這麼做複雜。 – Faery