src/Front/Security/Authentication/CustomerAuthenticationSubscriber.php line 53

  1. <?php
  2. namespace App\Front\Security\Authentication;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface,
  4.     Symfony\Component\HttpFoundation\Request,
  5.     Symfony\Component\HttpFoundation\JsonResponse,
  6.     Symfony\Component\Security\Http\Event\LoginFailureEvent,
  7.     Symfony\Component\Security\Http\Event\LoginSuccessEvent,
  8.     Symfony\Component\Security\Http\Event\LogoutEvent;
  9. use App\Front\Exception\FrontApiException;
  10. final class CustomerAuthenticationSubscriber implements EventSubscriberInterface
  11. {
  12.     private const REQUEST_FIREWALL_CONTEXT_ATTRIBUTE '_firewall_context';
  13.     private const CUSTOMER_FIREWALL_NAME 'customer';
  14.     public static function getSubscribedEvents() : array
  15.     {
  16.         return [
  17.             LoginSuccessEvent::class => [
  18.                 ['onLoginSuccess'10],
  19.             ],
  20.             LoginFailureEvent::class => [
  21.                 ['onLoginFailure'10],
  22.             ],
  23.             LogoutEvent::class => [
  24.                 ['onLogout'10]
  25.             ]
  26.         ];
  27.     }
  28.     public function onLoginSuccess(LoginSuccessEvent $event): void
  29.     {
  30.         if (! $this->isEventCustomerFirewall($event) || ! $this->isOnlyJsonAcceptable($event->getRequest())) {
  31.             return;
  32.         }
  33.         $event->setResponse(new JsonResponse([
  34.             'message' => 'success'
  35.         ]));
  36.     }
  37.     public function onLoginFailure(LoginFailureEvent $event): void
  38.     {
  39.         if (! $this->isEventCustomerFirewall($event) || ! $this->isOnlyJsonAcceptable($event->getRequest())) {
  40.             return;
  41.         }
  42.         throw new FrontApiException(401$event->getException()->getMessage());
  43.     }
  44.     public function onLogout(LogoutEvent $event): void
  45.     {
  46.         $request $event->getRequest();
  47.         if (! $this->isRequestCustomerFirewall($request) || ! $this->isOnlyJsonAcceptable($request)) {
  48.             return;
  49.         }
  50.         $event->setResponse(new JsonResponse([
  51.             'message' => 'success'
  52.         ]));
  53.     }
  54.     private function getFirewallName(Request $request): ?string
  55.     {
  56.         if (! $context $request->attributes->get(self::REQUEST_FIREWALL_CONTEXT_ATTRIBUTE)) {
  57.             return null;
  58.         }
  59.         $contextPath explode('.'$context);
  60.         return end($contextPath);
  61.     }
  62.     private function isEventCustomerFirewall(LoginFailureEvent|LoginSuccessEvent $event): bool
  63.     {
  64.         return $event->getFirewallName() === self::CUSTOMER_FIREWALL_NAME;
  65.     }
  66.     private function isRequestCustomerFirewall(Request $request): bool
  67.     {
  68.         return $this->getFirewallName($request) === self::CUSTOMER_FIREWALL_NAME;
  69.     }
  70.     private function isOnlyJsonAcceptable(Request $request): bool
  71.     {
  72.         $acceptableTypes $request->getAcceptableContentTypes();
  73.         return count($acceptableTypes) === && $acceptableTypes[0] === 'application/json';
  74.     }
  75. }