среда, 14 мая 2014 г.

Symfony 2: Изменение ролей пользователем во время сессии

При реализации своей админки в проекте Symfony, возникла ситуация, когда пользователь с ролью ROLE_ADMIN убирал эту роль у себя самого. При этом он имел доступ ко всем защищенным этой ролью ресурсам до следующей "реальной" аутентификации. Иными словами, информация о ролях этого пользователя бралась из сессии и была устаревшей.

Как оказалось, поправить данную ситуацию в Symfony, очень просто. Для этого необходимо, чтобы сущность пользователя реализовывала интерфейс:

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

Этот интерфейс описывает всего один метод: isEqualTo. Реализация этого метода такая:

public function isEqualTo(UserInterface $user) {
    if ($user instanceof UserEntity) {
        // Check that the roles are the same, in any order
        $isEqual = count($this->getRoles()) == count($user->getRoles());
        if ($isEqual) {
            foreach($this->getRoles() as $role) {
                $isEqual = $isEqual && in_array($role, $user->getRoles());
            }
        }
        return $isEqual;
    }
    return false;
}

Удачи!

Комментариев нет:

Отправить комментарий