AuthenticationMiddleware.php 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. <?php
  2. declare(strict_types=1);
  3. namespace Shlinkio\Shlink\Rest\Middleware;
  4. use Fig\Http\Message\RequestMethodInterface;
  5. use Fig\Http\Message\StatusCodeInterface;
  6. use Mezzio\Router\RouteResult;
  7. use Psr\Http\Message\ResponseInterface as Response;
  8. use Psr\Http\Message\ServerRequestInterface as Request;
  9. use Psr\Http\Server\MiddlewareInterface;
  10. use Psr\Http\Server\RequestHandlerInterface;
  11. use Shlinkio\Shlink\Rest\Authentication\RequestToHttpAuthPluginInterface;
  12. use function Functional\contains;
  13. class AuthenticationMiddleware implements MiddlewareInterface, StatusCodeInterface, RequestMethodInterface
  14. {
  15. private array $routesWhitelist;
  16. private RequestToHttpAuthPluginInterface $requestToAuthPlugin;
  17. public function __construct(RequestToHttpAuthPluginInterface $requestToAuthPlugin, array $routesWhitelist)
  18. {
  19. $this->routesWhitelist = $routesWhitelist;
  20. $this->requestToAuthPlugin = $requestToAuthPlugin;
  21. }
  22. public function process(Request $request, RequestHandlerInterface $handler): Response
  23. {
  24. /** @var RouteResult|null $routeResult */
  25. $routeResult = $request->getAttribute(RouteResult::class);
  26. if (
  27. $routeResult === null
  28. || $routeResult->isFailure()
  29. || $request->getMethod() === self::METHOD_OPTIONS
  30. || contains($this->routesWhitelist, $routeResult->getMatchedRouteName())
  31. ) {
  32. return $handler->handle($request);
  33. }
  34. $plugin = $this->requestToAuthPlugin->fromRequest($request);
  35. $plugin->verify($request);
  36. $response = $handler->handle($request);
  37. return $plugin->update($request, $response);
  38. }
  39. }