2011-12-10 32 views
2

比較從的UserInterface類

interface UserInterface { 
    /** 
    * The equality comparison should neither be done by referential equality 
    * nor by comparing identities (i.e. getId() === getId()). 
    * 
    * However, you do not need to compare every attribute, but only those that 
    * are relevant for assessing whether re-authentication is required. 
    * 
    * @param UserInterface $user 
    * @return Boolean 
    */ 
    function equals(UserInterface $user); 
} 

我應該如何實現這個(「那些相關的評估是否重新認證是必需的」 )?那麼這是否意味着在Symfony 2重新認證(用戶名/密碼)後用戶?或者是這個功能用戶重新認證。我可以檢查id, username, password, salt嗎? Symfony不會通過密碼檢查重新驗證用戶,這應該足夠了嗎?

回答

8

如果equals()返回false用戶將被強制重新認證。你究竟做了什麼取決於你,因爲它從一個應用程序到另一個應用程序不同。通常,您需要比較影響安全性的用戶的所有內容。

例如,如果在您的應用中使用電子郵件和密碼進行身份驗證,則需要對它們進行比較。相反,比較名字和姓氏字段是沒有意義的,因爲它們不會影響與應用程序中的身份驗證相關的任何事情 - 當然,除非您的應用程序身份驗證以某種方式基於它們。

如果您在應用程序中支持不同的角色(例如,管理員和普通用戶),並且您的應用程序提供了爲用戶分配和重新分配這些角色的方法,則還需要比較角色。因爲如果您想要將用戶從管理員降級爲普通用戶,您希望該更改儘快生效 - 針對用戶的下一個請求 - 無需明確要求用戶註銷並重新登錄。如果您在這種情況下不比較角色,用戶將保持管理員直到她的會話過期。

檢查ID是沒有意義的,除非您的應用程序提供了一種方法來更改用戶的ID並將它們用於應用程序中的身份驗證目的。而且我也不會檢查salt,因爲如果它被改變,那也意味着密碼也被改變,所以僅僅檢查密碼就足夠了。

+0

偉大的答案,但在我的經驗,我不會考慮用戶密碼更改爲理由重新驗證:)只是我的2美分那裏... – Prof83

1

更新:

現在,從的UserInterface刪除,並添加到一個新的接口功能相同:EquatableInterface和函數名稱變更爲isEqualTo

所以,如果你想改變,迫使連接的用戶斷開的邏輯,你的用戶類需要實現的EquatableInterface接口功能isEqualTo

注意:如果你這樣做,你就失去了標準用戶檢查檢查修改密碼,修改用戶名,...