<?php
declare(strict_types=1);
namespace App\EventSubscriber;
use App\Entity\System\Employee;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
use Symfony\Component\Security\Core\Security;
class NotAuthorizedResponseSubscriber implements EventSubscriberInterface
{
private RouterInterface $router;
private Security $security;
public function __construct(
RouterInterface $router,
Security $security
) {
$this->router = $router;
$this->security = $security;
}
public static function getSubscribedEvents(): array
{
return [KernelEvents::RESPONSE => ['onKernelResponse', 1]];
}
public function onKernelResponse(ResponseEvent $event): void
{
if ($event->getResponse()->getStatusCode() === Response::HTTP_FORBIDDEN) {
$user = $this->security->getUser();
$token = $this->security->getToken();
if ($user instanceof Employee || $token instanceof SwitchUserToken) {
$event->setResponse(new RedirectResponse('/admin/'));
return;
}
$url = $this->router->generate('homepage');
$event->setResponse(new RedirectResponse($url));
}
if (
$event->getResponse() instanceof RedirectResponse
&& $event->getRequest()->getPathInfo() === '/admin/'
&& str_contains($event->getResponse()->getTargetUrl(), '/account/popuplogin')
) {
$url = $this->router->generate('admin_login');
$event->setResponse(new RedirectResponse($url));
}
}
}