src/EventSubscriber/LoginSubscriber.php line 31

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Component\UserRole\Manager\UserRoleManager;
  4. use App\Entity\User;
  5. use Scheb\TwoFactorBundle\Security\TwoFactor\Event\TwoFactorAuthenticationEvent;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  8. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  9. use Symfony\Component\Security\Http\Event\LoginSuccessEvent;
  10. use Symfony\Component\Security\Http\Event\SwitchUserEvent;
  11. class LoginSubscriber implements EventSubscriberInterface
  12. {
  13.     public function __construct(
  14.         private readonly SessionInterface $session,
  15.         private readonly UserRoleManager $userRoleManager
  16.     ) {
  17.     }
  18.     public static function getSubscribedEvents(): array
  19.     {
  20.         return [
  21.             SwitchUserEvent::class => 'onSecuritySwitchUser',
  22.             LoginSuccessEvent::class => 'onLoginSuccess',
  23.             'scheb_two_factor.authentication.complete' => 'onTwoFactorAuthenticationComplete',
  24.         ];
  25.     }
  26.     public function onLoginSuccess(LoginSuccessEvent $event): void
  27.     {
  28.         $this->interactiveLogin($event->getAuthenticatedToken());
  29.     }
  30.     public function onTwoFactorAuthenticationComplete(TwoFactorAuthenticationEvent $event): void
  31.     {
  32.         $this->interactiveLogin($event->getToken());
  33.     }
  34.     public function onSecuritySwitchUser(SwitchUserEvent $event): void
  35.     {
  36.         $this->setUserGroupPermissions($event->getToken());
  37.     }
  38.     /**
  39.      * calculate and assign UserRoleEntries.
  40.      */
  41.     private function setUserGroupPermissions(TokenInterface $token)
  42.     {
  43.         // ROLE_SUPER_ADMIN doesn't need user_role_entries
  44.         if (\in_array('ROLE_SUPER_ADMIN'$token->getRoleNames(), true)) {
  45.             return;
  46.         }
  47.         $roles $token->getUser()->getUserRoles();
  48.         $entries = [];
  49.         foreach ($roles as $role) {
  50.             $rolePermissions $this->userRoleManager->getRolePermissions($role);
  51.             // if role has all permissions, skip iteration
  52.             if (!$rolePermissions) {
  53.                 $token->setAttribute('user_role_entries', []);
  54.                 return;
  55.             }
  56.             if (\count($entries) > 0) {
  57.                 $rolePermissions array_intersect_key($rolePermissions$entries);
  58.                 foreach (array_diff_key($entries$rolePermissions) as $key => $val) {
  59.                     unset($entries[$key]);
  60.                 }
  61.             }
  62.             foreach ($rolePermissions as $classType => $permission) {
  63.                 // if classType already has a mask, calculate new mask
  64.                 if (\array_key_exists($classType$entries)) {
  65.                     $entries[$classType] = $entries[$classType] | $permission['mask'];
  66.                     continue;
  67.                 }
  68.                 $entries[$classType] = $permission['mask'];
  69.             }
  70.         }
  71.         $token->setAttribute('user_role_entries'$entries);
  72.     }
  73.     private function interactiveLogin(TokenInterface $token): void
  74.     {
  75.         $this->setUserGroupPermissions($token);
  76.         /** @var User $user */
  77.         $user $token->getUser();
  78.         if (null !== $user->getLocale()) {
  79.             $this->session->set(AdminSubscriber::ADMIN_USER_LOCALE$user->getLocale());
  80.         }
  81.         $this->session->set('site_access'true);
  82.     }
  83. }