【发布时间】:2019-01-30 07:41:56
【问题描述】:
我需要在我正在开发的 Symfony v4.2.1 应用程序的自定义内核响应侦听器中访问当前用户。当我尝试从侦听器中的 TokenStorage 检索令牌时,我得到空值。从what I read 开始,这是正常的,因为该事件发生在 Symfony 安全防火墙运行之前,但是由于我迫切需要访问侦听器中的令牌,我想知道是否有解决方法。在以前的版本中,解决方法是play on priorities,但我认为这已经不可能了。
这是来自 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/occurrences”。以下是 debug:route 命令的相关部分:
api_occurrences_get_collection GET ANY ANY /api/occurrences.{_format}
它是由我使用的框架、API 平台根据实体类名称(Occurrence)自动分配的。
以下是相关事件的优先级:
"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
------- -------------------------------------------------------------------------------------------- ----------
编辑
经过更多测试后,我意识到只有当我通过浏览器调用 Web 服务时才会发生这种情况。如果使用 curl 例如令牌已成功检索。所以我猜这个问题似乎与 Symfony 核心无关,而是与 API 框架平台和我的自定义安全设置之间的交互有关。
【问题讨论】:
-
在防火墙之前调用内核响应监听器?这在技术上怎么可能?您需要防火墙来生成响应,然后由响应侦听器侦听该响应。问题可能是别的……
-
我的断言基于斯托夫在 github 问题中的回复,我的问题中的第一个链接指的是:“如果您的方法不在防火墙后面(或者如果您在防火墙之前调用它,它可以返回 null在 CLI 中,在早期 kernel.request 侦听器或 kernel.response 或 kernel.exception 侦听器中运行早期异常)。"
-
简单评论一下:听众的优先级仍然非常重要。您似乎还有其他事情发生,但您可以转储侦听器并检查他们的优先级。
-
Cerad,我在我的问题中添加了相关的优先级,似乎自定义侦听器排在第一位。不过,如果从 curl 调用 Web 服务,我可以毫无问题地获取令牌。