Symfony:事件订阅者。当路由要求用户必须经过身份验证时触发 404 页面(取决于 .env var)
Symfony : EventSubscriber. trigger a 404 page when a route require user must be authenticated (depending of the .env var)
在我的项目中,我创建了一些控制器和一些路由。
我向某些控制器和某些特定路由添加了这种条件“@IsGranted("IS_AUTHENTICATED_FULLY")
”,如下所示:
根据环境变量,我想禁用需要验证的路由(禁用 = 自动重定向到 404 页面)。我的问题:
从 EventSubscriber,我如何检查当前路由是否需要认证用户?
您可以使用 kernel.exception
event 获得 403 / Forbidden 异常的通知,Symfony 在这种情况下会自动抛出该异常。
在事件处理程序中,您可以覆盖响应并将其替换为 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 并实现自定义控制器。在配置的控制器操作中,您还可以 return a RedirectResponse
.
# config/packages/framework.yaml
framework:
error_controller: App\Controller\ErrorController::show
在我的项目中,我创建了一些控制器和一些路由。
我向某些控制器和某些特定路由添加了这种条件“@IsGranted("IS_AUTHENTICATED_FULLY")
”,如下所示:
根据环境变量,我想禁用需要验证的路由(禁用 = 自动重定向到 404 页面)。我的问题:
从 EventSubscriber,我如何检查当前路由是否需要认证用户?
您可以使用 kernel.exception
event 获得 403 / Forbidden 异常的通知,Symfony 在这种情况下会自动抛出该异常。
在事件处理程序中,您可以覆盖响应并将其替换为 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 并实现自定义控制器。在配置的控制器操作中,您还可以 return a RedirectResponse
.
# config/packages/framework.yaml
framework:
error_controller: App\Controller\ErrorController::show