2

我正在尝试使用 LexikJWTAuthBundle 和 FOSRestBundle 来保护我的 API 路由。当我在请求的标头中手动提供 JWT 时效果很好,但是对于我的应用程序,我想通过“kernel.request”SF 事件在每个 API 请求的标头中自动添加它。

问题是我的事件订阅者似乎没有正确分派,我想 LexikJWTAuthBundle 之前检测到我的请求中没有任何 JWT 并返回 401 响应。

事件订阅者:

<?php

namespace MyApp\APIBundle\EventListener;

use MyApp\APIBundle\Controller\TokenAPIController;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class RequestAPIListener implements EventSubscriberInterface
{
    /**
     * @var string Token API
     */
    private $apiToken;

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

    /**
     * {@inheritdoc}
     */
    public static function getSubscribedEvents()
    {
        // dump('hi'); <---- This is execute when uncomment
        // die;
        return [
            KernelEvents::REQUEST => [
                'onRequest'
            ]
        ];
    }

    public function onRequest(GetResponseEvent $event)
    {
        dump($event, $this->apiToken); <---- This is not execute
        die;

        $request->headers->set('Authorization', "Bearer $token");
    }
}

事件订阅者定义:

services:
    myapp.api_bundle.event_listener.request_api:
        class: MyApp\APIBundle\EventListener\RequestAPIListener
        arguments: ['@=service("service_container").get("session").get("api_token")']
        tags:
            - { name: kernel.event_subscriber }

我该如何解决这个问题?或者,如果您知道另一种自动添加令牌的方法?

4

1 回答 1

1

问题只是我的自定义侦听器的优先级。

防火墙监听器是在我之前触发的,所以我为我的设置了更高的优先级:

public static function getSubscribedEvents()
    {
        return [
            KernelEvents::REQUEST => [
                ['onRequest', 10]
            ]
        ];
    }
于 2017-01-07T10:49:19.037 回答