Задать вопрос
@Kripto77

Как в Symfony 4.3 принудительно разлогинить юзера по ID?

Админу необходимо периодически менять роли пользователей. Проблема в том что текущие роли юзера кешируются при залогине. И смена ролей в базе не меняет реальные права доступа в методах IS_GRANTED (в аннотациях, twig и т.д.)

Подскажите как принудительно разлогинить нужного юзера по ID ?

Заранее спасибо
  • Вопрос задан
  • 412 просмотров
Подписаться 2 Простой 4 комментария
Решения вопроса 2
В symfony для этих целей есть EquatableInterface. Каждый раз при загрузке кешированного юзера из токена, если у вас класс User имплементирует EquatableInterface запускается проверка соответствия сохраненного пользователя в токене и полученным из провайдера данным. Если данные не совпадают, токен авторизации аннулируется.

Проще говоря, в вашем случае - реализуйте у класса User EquatableInterface и добавьте в isEqualTo() проверку совпадения ролей.
Ответ написан
@Kripto77 Автор вопроса
Doc

Решение через EquatableInterface. Сокращенный класс что получилось:

//src/Entity/User.php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Security\Core\User\EquatableInterface;

/**
 * @ORM\Table(name="user", uniqueConstraints={@ORM\UniqueConstraint(name="UNIQ_8D93D649E7927C74", columns={"email"})})
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @UniqueEntity(fields={"email"}, message="There is already an account with this email")
 * @ORM\HasLifecycleCallbacks()
 */

class User implements UserInterface, EquatableInterface
{
   /**
     * @see EquatableInterface
     * @param UserInterface $user
     * @return bool
     */
    public function isEqualTo(UserInterface $user): bool
    {
        return $user->roles === $this->roles;
    }

}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы