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

Posted

技术标签:

【中文标题】Symfony:事件订阅者。当路由要求用户必须经过身份验证时触发 404 页面(取决于 .env var)【英文标题】:Symfony : EventSubscriber. trigger a 404 page when a route require user must be authenticated (depending of the .env var) 【发布时间】:2021-10-27 23:27:33 【问题描述】:

在我的项目中,我创建了一些控制器和一些路由。

我将这个条件“@IsGranted("IS_AUTHENTICATED_FULLY")”添加到一些控制器和一些特定的路由中:

根据 env 变量,我想禁用需要身份验证的路由(禁用 = 自动重定向到 404 页面)。我的问题:

从 EventSubscriber 中,我如何检查当前路由是否需要经过身份验证的用户?

【问题讨论】:

请不要将代码添加为图片。 【参考方案1】:

您可以使用kernel.exception event 来获取 Symfony 在这种情况下会自动抛出的 403 / Forbidden 异常的通知。 在事件处理程序中,您可以覆盖响应并将其替换为RedirectResponse

<?php

namespace App;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class ControllerListener implements EventSubscriberInterface

    public static function getSubscribedEvents()
    
        return [
            KernelEvents::EXCEPTION => 'onException',
        ];
    

    public function onException(ExceptionEvent $event)
    
        // implement custom logic and set your response, eg.:
        // $event->setResponse(new RedirectResponse(...))
    

另一种方法是覆盖framework.error_controller configuration 并实现自定义控制器。在配置的控制器操作中,您还可以返回 RedirectResponse

# config/packages/framework.yaml
framework:
    error_controller: App\Controller\ErrorController::show

【讨论】:

以上是关于Symfony:事件订阅者。当路由要求用户必须经过身份验证时触发 404 页面(取决于 .env var)的主要内容,如果未能解决你的问题,请参考以下文章

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

Symfony2 语言环境整页事件监听器

symfony 2 在防火墙检查之前在事件监听器中添加角色

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

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

Symfony3 onSecurityInteractiveLogin注销并设置flash