2013-01-05 41 views
2

我一直在尋找我的Symfony2驗證選項。問題是這樣的:你應該如何驗證密碼設置者的輸入?

我有一個會員類散列在setPassword方法密碼:

public function setPassword($password) 
{ 
    $this->password = Encrypt::cryptPassword($password); 
} 

哈希無論是原始輸入的存在很長的字符串。

爲此驗證這樣是沒用的:因爲不管輸入的有效性的創建哈希串

* @Assert\NotBlank() 
* @Assert\Length(
*  min = "8", 
*  max = "15", 
*  minMessage = "Your password must be at least {{ limit }} characters", 
*  maxMessage = "Your password cannot be longer than {{ limit }} characters" 
*) 

驗證被觸發。

我看着嘗試getter驗證,但這也似乎是一個死衚衕,因爲再一次,我真正想要驗證的是setPassword()的原始輸入並在setPassword創建散列後獲取散列值價值是沒有幫助的。

對此的推薦方法是否與現有的驗證組件一起使用,這將允許我驗證原始用戶輸入?

更新

雖然我接受了答案,它是不是真的可行。它確實導致 me專注於生命週期回調系統,這可能是解決方案的一部分。

鑑於目前的建議,一旦密碼編碼的第一 時間,超過驗證,任何時候你嘗試,因爲散列密碼當然不是輸入,不能 解密成原來的輸入編輯實體 。

我現在在實體單獨的屬性與使用驗證組 的實驗,純粹 輸入密碼的進入,沿觸發使用在某些情況下的驗證(新用戶創建 /密碼改變),而在其他情況下省略它。我做了 計劃利用prePersist和preUpdate回調來執行密碼的 編碼。

只是爲了記錄,這是在一個應用程序, 提供了一個REST API,以及管理工具和網站前端 結束選定的功能。

回答

12

使用原則lifecycles並且從不修改設置者的行爲!

<?php 

// ... 

/** 
* @ORM\Entity() 
* @ORM\HasLifecycleCallbacks() 
*/ 
class Member 
{ 
    public function setPassword($password) 
    { 
     $this->password = $password; 
    } 

    /** 
    * @ORM\PrePersist 
    * 
    * First time you save the entity 
    */ 
    public function prePersist() 
    { 
     $this->password = Encrypt::cryptPassword($this->password); 
    } 
} 

在這個例子中,密碼不會被編碼,直到你保存你的成員對象,所以它可以通過斷言來驗證!

然而Symfony2的安全配備,可以加密成員的密碼,只是做的工作爲你的防火牆:

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

+0

Sybio是正確的,你應該使用Symfony2的安全組件。它是高度可配置的,並允許您定義自己的密碼編碼器,在保存用戶時調用它。因此,在驗證過程中,您將擁有普通密碼(Symfony不會存儲在會話中),並且可以在沒有問題的情況下使用斷言。 – flu

+0

@Sybio:這看起來很有希望,會給它一個旋轉,並跟進。 – gview

+0

這不是一個真正可行的答案,因爲不幸的是,一旦密碼被編碼,之後就會超過驗證。我現在正在試驗一個純粹用於輸入密碼的實體中的單獨屬性。 – gview