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.          *
  28.          * @psalm-suppress DeprecatedClass
  29.          */
  30.         $passport $event->getPassport();
  31.         if (!$passport->hasBadge(ScopeBadge::class)) {
  32.             return;
  33.         }
  34.         /** @var ScopeBadge $badge */
  35.         $badge $passport->getBadge(ScopeBadge::class);
  36.         if ($badge->isResolved()) {
  37.             return;
  38.         }
  39.         /** @var Request $request */
  40.         $request $this->requestStack->{method_exists($this->requestStack'getMainRequest') ? 'getMainRequest' 'getMasterRequest'}();
  41.         /** @var list<string> $requestedScopes */
  42.         $requestedScopes $request->attributes->get('oauth2_scopes', []);
  43.         if ([] !== $requestedScopes && [] !== array_diff($requestedScopes$badge->getScopes())) {
  44.             throw InsufficientScopesException::create();
  45.         }
  46.         $badge->markResolved();
  47.     }
  48.     public static function getSubscribedEvents(): array
  49.     {
  50.         return [
  51.             CheckPassportEvent::class => ['checkPassport'256],
  52.         ];
  53.     }
  54. }