Symfony 2 UserInterface :: equals($ user):比较重新验证

时间:2011-12-10 08:23:19

标签: authentication symfony

来自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不通过密码检查重新验证用户,这应该足够了吗?

2 个答案:

答案 0 :(得分:8)

如果equals()返回false,则会强制用户重新进行身份验证。你究竟检查了什么取决于你,因为它因应用程序而异。通常,您需要比较影响应用安全性的用户可能发生的变化。

例如,如果您的应用使用电子邮件和密码进行身份验证,则需要对其进行比较。相反,比较名字和姓氏字段没有意义,因为它们不会影响与您的应用程序中的身份验证相关的任何内容 - 当然,除非您的应用程序身份验证以某种方式基于它们。

如果您在应用中支持不同的角色(例如,管理员和普通用户),并且您的应用提供了一种向用户分配和重新分配这些角色的方法,那么您还需要比较角色。因为如果您想要将用户从管理员降级为普通用户,您希望该更改尽快生效 - 在用户的下一个请求中 - 而无需明确要求用户注销和重新登录。如果您在这种情况下不比较角色,则用户将保持管理员状态,直到她的会话过期。

检查ID没有意义,除非您的应用提供了更改用户ID的方法,并且它们在您的应用中用于身份验证。我也不会检查盐,因为如果它改变了也意味着密码也改变了,所以单独检查密码就足够了。

答案 1 :(得分:1)

更新

现在,相同的功能已从UserInterface中删除并添加到新界面: EquatableInterface ,并且功能名称已更改为 isEqualTo

因此,如果您想更改强制连接用户断开连接的逻辑,您的User类需要实现 EquatableInterface 接口函数 isEqualTo

请注意:如果您这样做,您将失去检查修改后的密码,修改后的用户名等的标准用户检查...