2011-12-10 65 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

注意:如果你这样做,你就失去了标准用户检查检查修改密码,修改用户名,...