src/Access/Listener/AccessCheckListener.php line 43

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Access\Listener;
  4. use Arobases\SyliusRightsManagementPlugin\Access\Checker\AdminRouteChecker;
  5. use Arobases\SyliusRightsManagementPlugin\Access\Checker\AdminRouteCheckerInterface;
  6. use Arobases\SyliusRightsManagementPlugin\Access\Checker\AdminUserAccessChecker;
  7. use Arobases\SyliusRightsManagementPlugin\Access\Checker\AdminUserAccessCheckerInterface;
  8. use Arobases\SyliusRightsManagementPlugin\Provider\CurrentAdminUserProvider;
  9. use Arobases\SyliusRightsManagementPlugin\Provider\CurrentAdminUserProviderInterface;
  10. use Sylius\Component\Core\Model\AdminUserInterface;
  11. use Symfony\Component\HttpFoundation\RedirectResponse;
  12. use Symfony\Component\HttpFoundation\Session\Session;
  13. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  14. use Symfony\Component\HttpKernel\Event\RequestEvent;
  15. use Symfony\Component\HttpKernel\HttpKernelInterface;
  16. use Symfony\Component\Routing\RouterInterface;
  17. class AccessCheckListener
  18. {
  19.     private CurrentAdminUserProviderInterface $currentAdminUserProvider;
  20.     private AdminUserAccessCheckerInterface $adminUserAccessChecker;
  21.     private AdminRouteCheckerInterface $adminRouteAccessChecker;
  22.     private SessionInterface $session;
  23.     private RouterInterface $router;
  24.     public function __construct(CurrentAdminUserProviderInterface $currentAdminUserProviderAdminUserAccessCheckerInterface $adminUserAccessCheckerAdminRouteCheckerInterface $adminRouteAccessCheckerSessionInterface $sessionRouterInterface $router)
  25.     {
  26.         $this->currentAdminUserProvider $currentAdminUserProvider;
  27.         $this->adminUserAccessChecker $adminUserAccessChecker;
  28.         $this->adminRouteAccessChecker $adminRouteAccessChecker;
  29.         $this->session $session;
  30.         $this->router $router;
  31.     }
  32.     public function onKernelRequest(RequestEvent $event): void
  33.     {
  34.         if ($event->getRequestType() !== HttpKernelInterface::MAIN_REQUEST) {
  35.             return;
  36.         }
  37.         $routeName $event->getRequest()->get('_route');
  38.         if (null === $routeName) {
  39.             return;
  40.         }
  41.         if (strpos($routeName'partial') || $routeName === 'sylius_admin_dashboard' || $routeName === 'sylius_admin_login' || $routeName === '2fa_login' || $routeName === '2fa_login_check') {
  42.             return;
  43.         }
  44.         if (!$this->adminRouteAccessChecker->isAdminRoute($routeName)) {
  45.             return;
  46.         }
  47.         $adminUser $this->currentAdminUserProvider->getCurrentAdminUser();
  48.         if ($adminUser->getRole() === null) {
  49.             $event->setResponse($this->redirectUser($this->getRedirectRoute(), $this->getRedirectMessage()));
  50.         }
  51.         if ($adminUser instanceof AdminUserInterface && $adminUser->getRole()) {
  52.             $isUserGranted $this->adminUserAccessChecker->isUserGranted($adminUser$routeName);
  53.             if (!$isUserGranted) {
  54.                 $event->setResponse($this->redirectUser($this->getRedirectRoute(), $this->getRedirectMessage()));
  55.             }
  56.         }
  57.     }
  58.     private function getRedirectRoute(): string
  59.     {
  60.         return  $this->router->generate('sylius_admin_dashboard');
  61.     }
  62.     private function getRedirectMessage(): string
  63.     {
  64.         return  'arobases_sylius_rights_management.message.access_denied';
  65.     }
  66.     protected function redirectUser(string $routestring $message): RedirectResponse
  67.     {
  68.         $this->session->getFlashBag()->add('error'$message);
  69.         return new RedirectResponse($route);
  70.     }
  71. }