vendor/league/oauth2-server-bundle/src/Security/EventListener/CheckScopeListener.php line 29

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace League\Bundle\OAuth2ServerBundle\Security\EventListener;
  4. use League\Bundle\OAuth2ServerBundle\Security\Exception\InsufficientScopesException;
  5. use League\Bundle\OAuth2ServerBundle\Security\Passport\Badge\ScopeBadge;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
  10. use Symfony\Component\Security\Http\Event\CheckPassportEvent;
  11. /**
  12.  * Checks that requested scopes are matching with token scopes.
  13.  *
  14.  * @author Mathias Arlaud <mathias.arlaud@gmail.com>
  15.  */
  16. final class CheckScopeListener implements EventSubscriberInterface
  17. {
  18.     private $requestStack;
  19.     public function __construct(RequestStack $requestStack)
  20.     {
  21.         $this->requestStack $requestStack;
  22.     }
  23.     public function checkPassport(CheckPassportEvent $event): void
  24.     {
  25.         /**
  26.          * @var Passport $passport
  27.          * @psalm-suppress DeprecatedClass
  28.          */
  29.         $passport $event->getPassport();
  30.         if (!$passport->hasBadge(ScopeBadge::class)) {
  31.             return;
  32.         }
  33.         /** @var ScopeBadge $badge */
  34.         $badge $passport->getBadge(ScopeBadge::class);
  35.         if ($badge->isResolved()) {
  36.             return;
  37.         }
  38.         /** @var Request $request */
  39.         $request $this->requestStack->{method_exists($this->requestStack'getMainRequest') ? 'getMainRequest' 'getMasterRequest'}();
  40.         /** @var list<string> $requestedScopes */
  41.         $requestedScopes $request->attributes->get('oauth2_scopes', []);
  42.         if ([] !== $requestedScopes && [] !== array_diff($requestedScopes$badge->getScopes())) {
  43.             throw InsufficientScopesException::create();
  44.         }
  45.         $badge->markResolved();
  46.     }
  47.     public static function getSubscribedEvents(): array
  48.     {
  49.         return [
  50.             CheckPassportEvent::class => ['checkPassport'256],
  51.         ];
  52.     }
  53. }