Получение токена безопасности в прослушивателях ответов ядра - PullRequest
0 голосов
/ 30 января 2019

Мне нужно получить доступ к текущему пользователю в пользовательском прослушивателе ответов ядра в приложении Symfony v4.2.1, над которым я работаю.Когда я пытаюсь получить токен из TokenStorage в слушателе, я получаю ноль.Из того, что я прочитал , это нормально, потому что событие происходит до запуска брандмауэра безопасности Symfony, но, поскольку мне крайне необходимо получить доступ к токену в приемнике, я подумал, есть ли обходной путь для этого.В предыдущих версиях обходной путь должен был играть на приоритетах , но я не думаю, что это больше возможно.

Вот конфигурация брандмауэра из security.yaml:

firewalls:
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: true
        guard:
            authenticators:
                #- App\Security\SSOAuthenticator
                 - App\Security\YesAuthenticator
    main:
        anonymous: ~
        logout: ~

        guard:
            authenticators:
                #- App\Security\SSOAuthenticator
                 - App\Security\YesAuthenticator

Маршрут, с которым у меня возникли проблемы, - это "/ api / вхождения".Вот соответствующая часть из команды debug: route:

  api_occurrences_get_collection   GET      ANY      ANY    /api/occurrences.{_format}  

Она автоматически назначается используемой мной платформой, платформой API, на основе имени класса сущности (Вхождение).

Вот приоритеты для соответствующего события:

"kernel.response" event
-----------------------

 ------- -------------------------------------------------------------------------------------------- ---------- 
  Order   Callable                                                                                     Priority  
 ------- -------------------------------------------------------------------------------------------- ---------- 
  #1      App\EventListener\MyResponseListener::onKernelResponse()                                 0         
  #2      ApiPlatform\Core\Hydra\EventListener\AddLinkHeaderListener::onKernelResponse()               0         
  #3      Symfony\Component\HttpKernel\EventListener\ResponseListener::onKernelResponse()              0         
  #4      Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::onKernelResponse()          0         
  #5      Symfony\Component\Security\Http\RememberMe\ResponseListener::onKernelResponse()              0         
  #6      Sensio\Bundle\FrameworkExtraBundle\EventListener\HttpCacheListener::onKernelResponse()       0         
  #7      ApiPlatform\Core\HttpCache\EventListener\AddHeadersListener::onKernelResponse()              -1        
  #8      Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelResponse()              -100      
  #9      Symfony\Bundle\WebProfilerBundle\EventListener\WebDebugToolbarListener::onKernelResponse()   -128      
  #10     Symfony\Component\HttpKernel\EventListener\SessionListener::onKernelResponse()               -1000     
  #11     Symfony\Component\HttpKernel\EventListener\StreamedResponseListener::onKernelResponse()      -1024     
 ------- -------------------------------------------------------------------------------------------- ---------- 

РЕДАКТИРОВАТЬ

После еще нескольких тестов я понял, что это происходит только тогда, когда я вызываю веб-службу через браузер,Если используется curl, например, токен успешно получен.Таким образом, я думаю, что проблема связана не с ядром Symfony, а с взаимодействием между платформой API и моей пользовательской настройкой безопасности.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Если хранилище токенов возвращает значение null, это, вероятно, означает, что URL-адрес, на котором вы в данный момент пытаетесь его использовать, не включен в брандмауэр или что пользователь не прошел проверку подлинности.( Неаутентифицированные запросы имеют нулевой токен )

Вы не против поделиться своей конфигурацией безопасности и частью маршрутизации приложения, с которым вы боретесь?

0 голосов
/ 30 января 2019

Вы пробовали использовать класс Symfony\Component\Security\Core\Security вместо TokenStorage?

После этого просто используйте $this->security->getUser() с защитой, автоматически подключаемой в конструкторе.

Если это не помогло, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...