如何在 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 异常?的主要内容,如果未能解决你的问题,请参考以下文章