如何检查用户角色是否已更改?

时间:2013-10-06 10:40:52

标签: symfony

我想检查用户的角色是否已更改。

请看这个例子:我是管理员,我想更改另一个管理员(ROLE_MEMBER_ADMINROLE_USER)的角色。但只有当他断开并重新连接时,成员的角色才会改变。

isEqualTo的{​​{1}}方法是解决方案吗?我该如何实施呢?

2 个答案:

答案 0 :(得分:0)

我认为你应该自己实施它。这听起来有点像用户日志。

您可以创建一个新表,记录与userid相关的所有事件。然后你可以记录每个事件。

之后,您可以编写一个功能,检查用户是否有更改。

答案 1 :(得分:0)

在您的用户实体中:

use Symfony\Component\Security\Core\User\EquatableInterface;
use Symfony\Component\Security\Core\User\UserInterface;

class User implements UserInterface, \Serializable, EquatableInterface {

    /* took out getters/setters/ members declaration for clarity */

    /**
    * @see \Serializable::serialize()
    */
    public function serialize() {
        return serialize(array(
            $this->id,
            $this->username,
            $this->email,
            $this->password,
            $this->isActive,
            $this->roles
        ));
    }

    /**
     * @see \Serializable::unserialize()
     */
    public function unserialize($serialized) {
        list (
            $this->id,
            $this->username,
            $this->email,
            $this->password,
            $this->isActive,
            $this->roles
        ) = unserialize($serialized);
    }

    public function isEqualTo(UserInterface $user) {
        if (!$user instanceof User) {
            return false;
        }

        if ($this->password !== $user->getPassword()) {
            return false;
        }

        if ($this->username !== $user->getUsername()) {
            return false;
        }

        if ($this->email !== $user->getEmail()) {
            return false;
        }

        if ($this->isActive !== $user->isEnabled()) {
            return false;
        }

        // check roles
        // http://www.metod.si/symfony2-reload-user-roles/
        if (md5(serialize($this->getRoles())) !== md5(serialize($user->getRoles()))) {
            return false;
        }

        return true;
    }
}

应该这样做,使用PHP 5.3.27进行测试,PHP 5.4.X在序列化方面存在一些问题。

希望这有帮助。