src/App/Subscriber/UserRolesChangedSubscriber.php line 21

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace App\Subscriber;
  3. use App\Entity\User;
  4. use App\Event\UserRolesChangedEvent;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  7. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  8. class UserRolesChangedSubscriber implements EventSubscriberInterface
  9. {
  10.     private TokenStorageInterface $tokenStorage;
  11.     public function __construct(TokenStorageInterface $tokenStorage)
  12.     {
  13.         $this->tokenStorage $tokenStorage;
  14.     }
  15.     public function onRolesChanged(UserRolesChangedEvent $event): void
  16.     {
  17.         if (null === $token $this->tokenStorage->getToken()) {
  18.             return;
  19.         }
  20.         $user $token->getUser();
  21.         if (!$user instanceof User) {
  22.             return;
  23.         }
  24.         if ($user->getId() !== $event->getUser()->getId()) {
  25.             return;
  26.         }
  27.         if (!method_exists($token'getFirewallName')) {
  28.             return;
  29.         }
  30.         // use token user here, in case there are some references left.
  31.         $user->reset();
  32.         $this->tokenStorage->setToken(new UsernamePasswordToken($event->getUser(), $token->getFirewallName(), $user->getRoles()));
  33.     }
  34.     /**
  35.      * @return array<string, array<int|string, array<int|string, int|string>|int|string>|string>
  36.      */
  37.     public static function getSubscribedEvents(): array
  38.     {
  39.         return [
  40.             UserRolesChangedEvent::class => 'onRolesChanged',
  41.         ];
  42.     }
  43. }