<?php
namespace Scabal\RetailBundle\EventSubscriber;
use Symfony\Component\HttpKernel\KernelEvents;
use Scabal\RetailBundle\Controller\TokenAuthController;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Scabal\RetailBundle\Helpers\JWTHandler;
class TokenSubscriber implements EventSubscriberInterface
{
public function onKernelController(FilterControllerEvent $event)
{
$controller = $event->getController();
if (is_array($controller)) {
$controller = $controller[0];
}
if ($controller instanceof TokenAuthController) {
$token = $this->retrieveUser($event);
if (!$token) {
$event->setController(function() {
return new JsonResponse(["error" => "Not authenticated"], 403);
});
return;
}
$event->getRequest()->attributes->set('vendor', $token["vendor"]);
$event->getRequest()->attributes->set('idCustomer', $token["idCustomer"]);
$event->getRequest()->attributes->set('priceList', $token["priceList"]);
$event->getRequest()->attributes->set('organisation', $token["organisation"]);
$event->getRequest()->attributes->set('branding', $token["branding"]);
$event->getRequest()->attributes->set('priceVisibility', $token["priceVisibility"]);
$event->getRequest()->attributes->set('profilePermissions', $token["profilePermissions"]);
}
}
private function retrieveUser($event) {
$request = $event->getRequest();
$authorization = $request->headers->get('Authorization', null);
if (!$authorization) {
return null;
}
$token = explode(' ', $authorization)[1];
$jwtHandler = new JWTHandler();
$user = $jwtHandler->decodeAccessToken($token);
return $user;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::CONTROLLER => 'onKernelController',
];
}
}