目前我在symfony中有以下事件监听器。
namespace {app-namespace}\EventListener;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use {app-namespace}\Common;
class InvalidCredentialsExceptionListener
{
public function onKernelException(GetResponseForExceptionEvent $event)
{
if ($event->getException() instanceof Common\InvalidCredentialsException) {
$response = new Response();
$response->setStatusCode('401');
$event->setResponse($response);
}
}
}
我认为symfony会接收未经授权的状态代码,然后继续处理它,好像它是使用标准安全防火墙在堆栈中返回的更低。这可能吗。我宁愿不在这里修建网址。
答案 0 :(得分:3)
Symfony 2的防火墙无法获取状态代码。 HTTP状态代码是Web服务器返回到webclient以提供有关请求发生的一些基本信息的内容。它不是内部应用程序所需要的东西。
我建议您查看FormAuthenticationEntryPoint中的start()
方法,它将为您提供Symfony 2如何处理此转发/重定向操作的良好示例。
您可以在异常侦听器中模仿此操作。我建议你将http-utils(service-id security.http_utils
)和路由器(服务id router
)注入你的监听器。使用路由器获取登录页面的路径,并使用http-utils创建重定向响应。如果要转发而不是重定向,则需要http-kernel(service-id http_kernel
),而不是http-utils。
答案 1 :(得分:0)
这是我几天前写的代码片段并成功使用了它:
public function onKernelException(GetResponseForExceptionEvent $event)
{
$exception = $event->getException();
$r = null;
$req = $event->getRequest();
if ($this->kernel->getEnvironment() == "dev") {
return;
}
if ($exception instanceof RecoverableError) {
$r = new Response($exception->getMessage(), $exception->getCode());
}
else if ($exception instanceof NotFoundHttpException) {
// Symfony's HTTP404: Not found
}
else if ($exception instanceof AuthenticationException) {
$r = new Response("You need to login in order to view this content.", 403);
}
else {
// Http500: Server Error
$r = new Response("Unknown error occurred.", 500);
}
if ($r !== null) {
$event->setResponse($r);
}
}
特别注意这一行:
$r = new Response("You need to login in order to view this content.", 403);