如何在事件订阅者中访问 Symfony 3.3 中的登录用户而不会丢失 Web Profiler

Posted

技术标签:

【中文标题】如何在事件订阅者中访问 Symfony 3.3 中的登录用户而不会丢失 Web Profiler【英文标题】:How do I access the logged in user in Symfony 3.3 in an Event Subscriber without losing the web profiler 【发布时间】:2018-06-11 17:11:14 【问题描述】:

我对 Symfony 3 和面向对象的概念还比较陌生,所以如果我问一些愚蠢的问题,我深表歉意。

我正在构建一个包含多个组的应用程序,其中用户可以是多个组的成员,并且在每个组中可能具有不同的角色。

因此,我在每个请求上动态加载角色,并与他们正在访问的组进行比较。这也是为了通过手动更改浏览器地址来提供一些保护,以防止登录的用户切换组通过手动更改用户权限升级 - 如果他们更改到那里的组,他们有更少(或没有)权限我在执行之前加载角色控制器。

经过研究,似乎绑定到 kernel.request 或 kernel.controller 事件的事件订阅者是执行此操作的正确方法。

我需要访问此事件订阅者中的用户,并通过注入 TokenStorageInterface 来完成此操作。

如果我访问 $this->tokenStorage->getToken() 我有一个空值,但如果我访问 $this->tokenStorage->getToken()->getUser() 我得到有效的当前登录用户,但是失去开发者网络分析器——这对我来说非常有用。它还向我表明,我正在做的事情会干扰 Symfony 的“幕后”运行——这可能会在以后产生后果。

所以我的问题是;为什么我丢失了网络分析工具栏,我该如何找回它?

非常感谢

【问题讨论】:

【参考方案1】:

我最终注意到我的事件被触发了两次 - 进一步的研究表明 Web Profiler 工具栏正在触发事件本身。

我不知道为什么这意味着来自 tokenStorage 的令牌为 NULL,但是当我使用以下问题的公认答案排除 Web 分析器触发时,行为恢复到我的预期。它可能对其他人有所帮助;

Symfony2 : onKernelResponse called twice as MASTER_REQUEST

【讨论】:

以上是关于如何在事件订阅者中访问 Symfony 3.3 中的登录用户而不会丢失 Web Profiler的主要内容,如果未能解决你的问题,请参考以下文章

如何在 TYPO3 中使用 EventSubscriber,例如对于 symfony/工作流事件?

Symfony:事件订阅者。当路由要求用户必须经过身份验证时触发 404 页面(取决于 .env var)

如何在 Sonata Admin(Symfony 3.3、PHP 7)中使用自定义 javascript 为模态窗口扩展模板?

Symfony 3 - 无法将 token_storage 传递给订阅者

在 Symfony 2.3 控制器中访问 POST 请求的 JSON 正文

我应该在哪个条带事件中更新我的数据库以授予订阅者访问权限