src/EventSubscriber/OrganizationSubscriber.php line 29
<?phpnamespace App\EventSubscriber;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use Symfony\Component\HttpKernel\Event\ControllerEvent;use Symfony\Component\HttpKernel\Event\ResponseEvent;use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;use Symfony\Component\HttpKernel\KernelEvents;use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;use App\Controller\OrganizationAuthenticatedController;use App\Repository\Usm\UserRepository;class OrganizationSubscriber implements EventSubscriberInterface{private $tokenStorage;private $userRepository;public function __construct(TokenStorageInterface $tokenStorage, UserRepository $userRepository){$this->tokenStorage = $tokenStorage;$this->userRepository = $userRepository;}public function onKernelController(ControllerEvent $event){$controller = $event->getController();// when a controller class defines multiple action methods, the controller// is returned as [$controllerInstance, 'methodName']if (is_array($controller)) {$controller = $controller[0];}if (!$token = $this->tokenStorage->getToken()) {return ;}if (!$user = $token->getUser()) {return ;}if ($controller instanceof OrganizationAuthenticatedController) {$accessDenied = false;if ($event->getRequest()->headers->has('Organization')){$headerOrganizationId = $event->getRequest()->headers->get('Organization');$organizationId = $this->userRepository->getUserOrganization($user->getId());$organizationValid = false;if ($headerOrganizationId == $organizationId){$organizationValid = true;}else{$userRoles = $user->getRoles();if (in_array('ROLE_ADMIN', $userRoles)){$organizationValid = true;}}if ($organizationValid){// mark the request as having passed owner authentication$event->getRequest()->attributes->set('auth_organization_id', $organizationId);$event->getRequest()->getSession()->set('__organization', $organizationId);}else{$accessDenied = true;}}if ($accessDenied) {throw new AccessDeniedHttpException('This action needs a valid organization!');}}}public function onKernelResponse(ResponseEvent $event){// check to see if onKernelController marked this as a token "auth'ed" requestif (!$organizationId = $event->getRequest()->attributes->get('auth_organization_id')) {return;}$response = $event->getResponse();// create a hash and set it as a response header$hash = sha1($response->getContent().$organizationId);$response->headers->set('X-ORGANIZATION-ID', $hash);}public static function getSubscribedEvents(){return [KernelEvents::CONTROLLER => 'onKernelController',KernelEvents::RESPONSE => 'onKernelResponse',];}}