【问题标题】:How can I throw a 403 exception in Symfony2?如何在 Symfony2 中抛出 403 异常?
【发布时间】: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 响应。

标签: php symfony error-handling http-status-code-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.');

【讨论】:

    猜你喜欢
    • 2012-05-24
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2015-05-21
    • 2011-07-24
    • 2011-02-22
    • 2020-12-21
    相关资源
    最近更新 更多