src/Listener/Security/RoleChangeListener.php line 22

Open in your IDE?
  1. <?php
  2. namespace App\Listener\Security;
  3. use App\Entity\User;
  4. use Symfony\Component\HttpKernel\Event\RequestEvent;
  5. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  6. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  7. class RoleChangeListener
  8. {
  9.     /**
  10.      * @var TokenStorageInterface
  11.      */
  12.     private $storage;
  13.     public function __construct(TokenStorageInterface $storage)
  14.     {
  15.         $this->storage $storage;
  16.     }
  17.     public function onKernelRequest(RequestEvent $event)
  18.     {
  19.         $impersonating null;
  20.         $source null;
  21.         if (!$this->storage->getToken()) {
  22.             return;
  23.         }
  24.         $user $this->storage->getToken()->getUser();
  25.         if (!$user instanceof User) {
  26.             return;
  27.         }
  28.         $current $this->storage->getToken()->getRoleNames();
  29.         foreach ($current as $index => $role) {
  30.             if ('ROLE_PREVIOUS_ADMIN' !== $role) {
  31.                 continue;
  32.             }
  33.             unset($current[$index]);
  34.             $impersonating $role;
  35.         }
  36.         $new $user->getRoles();
  37.         // Check that the roles are the same, in any order
  38.         $isEqual $user->getGroups()->count() == count($current);
  39.         if ($isEqual) {
  40.             foreach ($current as $role) {
  41.                 $isEqual $isEqual && in_array($role$new);
  42.             }
  43.         }
  44.         if ($isEqual) {
  45.             return;
  46.         }
  47.         if (null !== $impersonating) {
  48.             $new[] = $impersonating;
  49.         }
  50.         $token = new UsernamePasswordToken($usernull'main'$new);
  51.         $this->storage->setToken($token);
  52.     }
  53. }