src/EventSubscriber/AuthenticateSubscriber.php line 85

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\ConnectionLog;
  4. use App\Entity\Local\AdminUser;
  5. use App\Model\ApiUser;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Oz\ApiNvl\Model\Permission;
  8. use App\Model\User;
  9. use Oz\ApiNvl\Provider\UserProvider;
  10. use Oz\ApiNvl\Transformer\ContextTransformer;
  11. use Oz\ApiNvl\Transformer\CustomerTransformer;
  12. use Oz\NvlPortalDisplayer\Service\User\UserHelper;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  15. use Symfony\Component\Security\Http\SecurityEvents;
  16. use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
  17. use Symfony\Contracts\HttpClient\Exception\DecodingExceptionInterface;
  18. use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
  19. use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
  20. use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
  21. use Symfony\Contracts\HttpClient\HttpClientInterface;
  22. class AuthenticateSubscriber implements EventSubscriberInterface
  23. {
  24.     /**
  25.      * @var UserProvider
  26.      */
  27.     private $userProvider;
  28.     /**
  29.      * @var EntityManagerInterface
  30.      */
  31.     private $em;
  32.     /**
  33.      * @var UserHelper
  34.      */
  35.     private $userHelper;
  36.     /**
  37.      * @var HttpClientInterface
  38.      */
  39.     private $api_nvl;
  40.     /**
  41.      * @param UserProvider           $userProvider
  42.      * @param EntityManagerInterface $em
  43.      * @param UserHelper             $userHelper
  44.      * @param HttpClientInterface    $api_nvl
  45.      */
  46.     public function __construct(
  47.         UserProvider           $userProvider,
  48.         EntityManagerInterface $em,
  49.         UserHelper             $userHelper,
  50.         HttpClientInterface    $api_nvl
  51.     )
  52.     {
  53.         $this->userProvider $userProvider;
  54.         $this->em           $em;
  55.         $this->userHelper   $userHelper;
  56.         $this->api_nvl      $api_nvl;
  57.     }
  58.     /**
  59.      * @return array[]
  60.      */
  61.     public static function getSubscribedEvents(): array
  62.     {
  63.         return [
  64.             SecurityEvents::INTERACTIVE_LOGIN => ['interactiveLogin'10],
  65.         ];
  66.     }
  67.     /**
  68.      * @param InteractiveLoginEvent $interactiveLoginEvent
  69.      *
  70.      * @throws ClientExceptionInterface
  71.      * @throws DecodingExceptionInterface
  72.      * @throws RedirectionExceptionInterface
  73.      * @throws ServerExceptionInterface
  74.      * @throws TransportExceptionInterface
  75.      */
  76.     public function interactiveLogin(InteractiveLoginEvent $interactiveLoginEvent): void
  77.     {
  78.         /** @var User $user */
  79.         $user $interactiveLoginEvent->getAuthenticationToken()->getUser();
  80.         if ($user instanceof ApiUser) {
  81.             return;
  82.         }
  83.         $this->setUserInfo($user);
  84.         $this->setUserPermissions($user);
  85.     }
  86.     /**
  87.      * @param User $user
  88.      *
  89.      * @return void
  90.      * @throws ClientExceptionInterface
  91.      * @throws DecodingExceptionInterface
  92.      * @throws RedirectionExceptionInterface
  93.      * @throws ServerExceptionInterface
  94.      * @throws TransportExceptionInterface
  95.      */
  96.     private function setUserInfo(User $user)
  97.     {
  98.         $infosResponse $this->userProvider->getInfosCustomAppToken($_ENV['APPTOKEN_PORTAIL_NEWS_NVL']);
  99.         if (200 != $infosResponse->getStatusCode()) {
  100.             throw new Exception('Impossible de récupérer les infos de l\'utilisateur ! 😕');
  101.         }
  102.         $infos $infosResponse->toArray();
  103.         $user->getInfo()
  104.              ->setPhone($infos['phone'] ?? null)
  105.              ->setFonction($infos['function'] ?? null)
  106.              ->setTrackingTickets($infos['trackingTicket'] ?? null);
  107.         $this->setUserContexts($user$infos['contexts']);
  108.         $this->setUserCustomers($user$infos['customers']);
  109.     }
  110.     /**
  111.      * @param User  $user
  112.      * @param array $contextsRaw
  113.      */
  114.     private function setUserContexts(User $user, array $contextsRaw): void
  115.     {
  116.         $contexts iterator_to_array(ContextTransformer::multipleConvertToObjects($contextsRaw));
  117.         if (!count($contexts)) {
  118.             return;
  119.         }
  120.         $user->setAvailableContexts($contexts);
  121.         $user->setContexts($contexts); // on met tout pour le moment
  122.     }
  123.     /**
  124.      * @param User  $user
  125.      * @param array $customersRaw
  126.      */
  127.     private function setUserCustomers(User $user, array $customersRaw): void
  128.     {
  129.         $customers iterator_to_array(CustomerTransformer::multipleConvertToObjects($customersRaw));
  130.         $user->setAvailableCustomers($customers);
  131.         foreach ($customers as $customer) {
  132.             $user->addCustomer($customer);
  133.         }
  134.     }
  135.     /**
  136.      * @param User $user
  137.      *
  138.      * @return void
  139.      * @throws ClientExceptionInterface
  140.      * @throws DecodingExceptionInterface
  141.      * @throws RedirectionExceptionInterface
  142.      * @throws ServerExceptionInterface
  143.      * @throws TransportExceptionInterface
  144.      */
  145.     private function setUserPermissions(User $user)
  146.     {
  147.         $rawDatasourcesResponse $this->api_nvl->request('GET''/api/datasources/', [
  148.             'headers' => [
  149.                 'apptoken'      => $_ENV['APPTOKEN_PORTAIL_NEWS_NVL'],
  150.                 'Authorization' => 'Bearer ' $user->getToken(),
  151.             ],
  152.         ]);
  153.         if (200 != $rawDatasourcesResponse->getStatusCode()) {
  154.             throw new Exception($rawDatasourcesResponse->toArray(false)['message']);
  155.         }
  156.         $rawDatasources $rawDatasourcesResponse->toArray();
  157.         $permissions    = [];
  158.         foreach ($rawDatasources as $datasource) {
  159.             $permissions[$datasource['id']] = (new Permission($datasource['id']))
  160.                 ->setRead(filter_var($datasource['read'], FILTER_VALIDATE_BOOLEAN))
  161.                 ->setWrite(filter_var($datasource['edit'], FILTER_VALIDATE_BOOLEAN))
  162.                 ->setValidate(filter_var($datasource['validation'], FILTER_VALIDATE_BOOLEAN));
  163.         }
  164.         $user->setPermissions($permissions);
  165.     }
  166. }