src/EventListener/OAuth2/AuthorizationCodeListener.php line 27

Open in your IDE?
  1. <?php
  2. namespace App\EventListener\OAuth2;
  3. use App\Entity\Commons\OAuth2\User;
  4. use App\Oauth2\Grant\AuthCodeGrant;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Cdp\Users\Transverse\Entity\Commons\Accounts;
  7. use Nyholm\Psr7\Response;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. use Trikoder\Bundle\OAuth2Bundle\Event\AuthorizationRequestResolveEvent;
  10. use Twig\Environment;
  11. class AuthorizationCodeListener
  12. {
  13.     protected RequestStack $requestStack;
  14.     protected Environment $templating;
  15.     protected EntityManagerInterface $commonsEm;
  16.     public function __construct(RequestStack $requestStackEnvironment $templatingEntityManagerInterface $commonsEm)
  17.     {
  18.         $this->requestStack $requestStack;
  19.         $this->templating $templating;
  20.         $this->commonsEm $commonsEm;
  21.     }
  22.     public function onAuthorizationRequestResolve(AuthorizationRequestResolveEvent $event)
  23.     {
  24.         // Si personne n'est loggué
  25.         // -> Ne devrait jamais arriver car le security va rerouter sur oauth2_auth_login si pas de user en session
  26.         if (null === $event->getUser()) {
  27.             $event->resolveAuthorization(AuthorizationRequestResolveEvent::AUTHORIZATION_DENIED);
  28.             return;
  29.         }
  30.         $user $event->getUser();
  31.         $request $this->requestStack->getMasterRequest();
  32.         // Si on a déjà sélectionné un account précedement, on skip
  33.         if ($request->getSession()->has(AuthCodeGrant::PARAMETER_ACCOUNT)) {
  34.             $event->resolveAuthorization(AuthorizationRequestResolveEvent::AUTHORIZATION_APPROVED);
  35.             return;
  36.         }
  37.         $account null;
  38.         // Depuis le template de selection l'account est simplement passé en GET
  39.         if ($accountId $request->query->get(AuthCodeGrant::PARAMETER_ACCOUNT)) {
  40.             $account $this->commonsEm->find(Accounts::class, $accountId);
  41.             if (!$account) {
  42.                 $event->resolveAuthorization(AuthorizationRequestResolveEvent::AUTHORIZATION_DENIED);
  43.                 return;
  44.             }
  45.             if ($account->getUser() != $user) {
  46.                 $event->resolveAuthorization(AuthorizationRequestResolveEvent::AUTHORIZATION_DENIED);
  47.                 return;
  48.             }
  49.         }
  50.         if (null === $account) {
  51.             // $accounts = $this->commonsEm->getRepository(Accounts::class)->findBy([
  52.             //     'user' => $user,
  53.             // ]);
  54.             $qb $this->commonsEm->createQueryBuilder();
  55.             $qb
  56.                 ->select('a')
  57.                 ->from(Accounts::class, 'a')
  58.                 ->andWhere('a.user = :user')
  59.                 ->setParameter("user"$user)
  60.                 ->innerJoin('a.fond''fond')
  61.                 ->orderBy('fond.libelle''ASC')
  62.             ;
  63.             
  64.             $accounts $qb->getQuery()->getResult();
  65.             // Si le user n'a qu'un seul account, on passe l'étape de selection
  66.             if (=== count($accounts)) {
  67.                 return $this->onSuccessAccountSelection($event$accounts[0]);
  68.             }
  69.             $content $this->templating->render('sso/choose_account.html.twig', [
  70.                 'accounts' => $accounts,
  71.             ]);
  72.             $response = new Response(200, [], $content);
  73.             $event->setResponse($response);
  74.             return;
  75.         } else {
  76.             return $this->onSuccessAccountSelection($event$account);
  77.         }
  78.     }
  79.     protected function onSuccessAccountSelection(AuthorizationRequestResolveEvent $eventAccounts $account)
  80.     {
  81.         $request $this->requestStack->getMasterRequest();
  82.         // On set en $_SESSION pour pouvoir l'integrer dans l'authorization_code
  83.         $request->getSession()->set(AuthCodeGrant::PARAMETER_ACCOUNT$account->getId());
  84.         $event->resolveAuthorization(AuthorizationRequestResolveEvent::AUTHORIZATION_APPROVED);
  85.         return;
  86.     }
  87. }