45 lines
1.4 KiB
PHP
45 lines
1.4 KiB
PHP
<?php
|
|
namespace App\EventListener;
|
|
|
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
|
|
use Symfony\Component\HttpKernel\KernelEvents;
|
|
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
|
|
use Symfony\Component\HttpFoundation\RedirectResponse;
|
|
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
|
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
|
|
|
|
|
class AccessDeniedListener implements EventSubscriberInterface
|
|
{
|
|
private $router;
|
|
|
|
public function __construct(UrlGeneratorInterface $router) {
|
|
$this->router=$router;
|
|
}
|
|
|
|
public static function getSubscribedEvents(): array
|
|
{
|
|
return [
|
|
// the priority must be greater than the Security HTTP
|
|
// ExceptionListener, to make sure it's called before
|
|
// the default exception listener
|
|
KernelEvents::EXCEPTION => ['onKernelException', 2],
|
|
];
|
|
}
|
|
|
|
public function onKernelException(ExceptionEvent $event): void
|
|
{
|
|
$exception = $event->getThrowable();
|
|
if (!$exception instanceof AccessDeniedException&&!$exception instanceof NotFoundHttpException) {
|
|
return;
|
|
}
|
|
|
|
$response = new RedirectResponse($this->router->generate('app_home'));
|
|
|
|
// optionally set the custom response
|
|
$event->setResponse($response);
|
|
|
|
}
|
|
} |