如何在 Symfony2 中抛出 403 异常?

Posted

技术标签:

【中文标题】如何在 Symfony2 中抛出 403 异常?【英文标题】:How can I throw a 403 exception in Symfony2? 【发布时间】:2014-03-22 20:06:16 【问题描述】:

我正在检查我的请求 URI 中是否有特定令牌,如果没有令牌或令牌错误,则抛出 Symfony\Component\Security\Core\Exception\AccessDeniedException

if(!isset($token) && $token != 'whatever') 
  throw new AccessDeniedException('No token given or token is wrong.');

但是当我使用这个AccessDeniedException 时,Symfony2 只是重定向到登录页面。相反,我想要一个专用的 403 错误页面(我已经创建了app/Resources/TwigBundle/views/Exceptions/error403.html.twig 文件)。

为了实现这一目标,我需要做出哪些改变?我必须使用 php 原生异常吗?但是我怎么知道要传递 403 错误代码呢?

Symfony2 是否可能有特定的 403-Exception,它不会简单地重定向到登录?

【问题讨论】:

你能不能 catch 异常并在 header() 中捕获一个 HTTP 403 错误? Symfony2 通常会捕获和处理所有异常。所以我并不是真的在寻找解决方法...... 使用 onKernelResponse() 捕捉您的响应。没有? 我不是 Symfony 方面的专家,所以我会把它留给更有资格回答的人;我不确定这些是否符合要求,但我想我会提到它们以防你错过它们:HttpException 和 AccessDeniedHttpException:api.symfony.com/2.4/Symfony/Component/HttpKernel/Exception.html 抛出 Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException。这将绕过安全系统并给你一个 403 响应。 【参考方案1】:

抛出Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException

这将绕过安全系统并为您提供 403 响应,而该响应又会被 twig 异常侦听器拾取。

【讨论】:

像魅力一样工作。正是我需要的。谢谢! 在 Symfony 2.5 中你也可以使用 throw $this->createAccessDeniedException('You cannot access this page!'); (见symfony.com/blog/…) @madc 很高兴知道。也谢谢! 当然这应该是HttpFoundation 的一部分,而不是HttpKernel 干杯。我尝试将AccessDeniedHttpException 扔到覆盖的EntityUserProvider 中,但奇怪的是它仍然以401 响应——异常一定是在堆栈的某个地方重新抛出。我最终使用了Voter,这实际上是一个非常简洁、易于实现的替代方案。【参考方案2】:

从 Symfony 2.6 开始,您可以使用以下控制器快捷方式来触发良好的异常:

return $this->denyAccessUnlessGranted('ROLE_EDIT', $item, 'You cannot edit this item.');

【讨论】:

以上是关于如何在 Symfony2 中抛出 403 异常?的主要内容,如果未能解决你的问题,请参考以下文章

springboot如何处理过滤器filter中抛出的异常

REST 服务切换到 https,在浏览器中工作,在 c# 中抛出“(403) Forbidden”错误

如何在扩展中抛出异常?

如何在 C 中抛出异常?

如何捕获ctypes中抛出的异常?

如何捕获 node_modules 中抛出的异常