使用静态密钥的简单 api 身份验证

Simple api auth with static key

我的项目 API 受到 symfony 安全防火墙的保护,有用户提供商等等。现在我只需要几个 public 仅使用单个令牌保护的路由,我的意思是单个随机 32 字符字符串,不需要用户提供程序、jwt 令牌等,只需检查此静态字符串是否匹配我的并响应。在 symfony(4) 中有没有比在每个请求事件上使用内核事件更好的方法?

这是我用于另一个项目的 class,其中 所有 路由应由 URL 令牌保护:

<?php

namespace App\AccessControl;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\HttpKernel\KernelEvents;

class AccessControlSubscriber implements EventSubscriberInterface
{

    private string $token;

    public function __construct(string $token)
    {
        $this->token = $token;
    }

    public static function getSubscribedEvents(): array
    {
        return [
            KernelEvents::CONTROLLER => 'onKernelController',
        ];
    }

    public function onKernelController(ControllerEvent $event): void
    {
        $controller = $event->getController();

        if (!is_array($controller)) {
            return;
        }

        $request = $event->getRequest();

        if (0 === strpos($request->getPathInfo(), '/_profiler') || 0 === strpos($request->getPathInfo(), '/_fragment')) {
            return;
        }

        $token = $request->query->get('token');

        if ($this->token !== $token || $this->token === '') {
            throw new AccessDeniedHttpException('This action needs a valid token!');
        }
    }
}

它挂钩到所有使用控制器的内核事件,就在解析控制器的参数和调用控制器操作本身之前。分析器路由被排除在外,这样你仍然可以使用它。


如果你只想将它用于 某些 控制器,你可以检查 $controller 数组中特定的 classes 设置,就像我一样为探查器工具栏的路线做了它