2016-12-21 9 views
2

APIルートをセキュリティで保護するために、FexRestBundleでLexikJWTAuthBundleを使用しようとしています。 私はリクエストのヘッダーに手動でJWTを渡すとうまく動作しますが、私のアプリケーションでは、 'kernel.request' SFイベントを介して各APIリクエストのヘッダーに自動的に追加したいと考えています。イベント 'kernel.request'が正しくディスパッチされない

問題は、私のイベントサブスクライバが正しくディスパッチされないようですが、私は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 } 

がどのように私はこの問題を解決することができますか?または、トークンを自動的に追加する別の方法が分かっている場合は、

答えて

0

問題は私のカスタムリスナーの優先順位に過ぎませんでした。

ファイアウォールリスナーは私の前にトリガされたので、私は私のために、優先度が高い設定:

public static function getSubscribedEvents() 
    { 
     return [ 
      KernelEvents::REQUEST => [ 
       ['onRequest', 10] 
      ] 
     ]; 
    } 
関連する問題