12

我刚刚发现了 SensioLabsInsight,并发现了关于如何编写好代码的非常有趣的技巧。如果有一些关于为什么(或为什么不)应该使用某些东西的解释,那就太好了——即使是像exitand之类的基本东西die。这将有助于我向与我一起工作的人解释事情。

所以我的问题是专门针对 AccessDeniedHttpException - 它说:

Symfony 应用程序不应抛出 AccessDeniedHttpException

那么如何从应用程序控制器或 EventListener 返回 403 Forbidden 呢?
最佳做法是什么?

老实说,我以为会是

throw new AccessDeniedHttpException()

因为对于 404 你有

throw $this->createNotFoundException()

但看起来我错了。

4

4 回答 4

22

我认为这意味着您必须抛出AccessDeniedException而不是直接抛出AccessDeniedHttpException.

主要原因是它被Symfony\Component\Security\Http\Firewall\ExceptionListenerAccessDeniedException中的事件监听器捕获,然后你可以用它做一些事情。检查功能。onKernelException

于 2013-08-23T13:42:31.197 回答
4

这句话必须考虑到 Symfony 的整个架构。

在 Symfony 框架中,有一个完整的子系统专门用于应用 2 步身份验证 + 授权过程的安全性。也就是说,在 Symfony 的架构中,控制器基本上是框架留给您开发的,因此它们是“应用程序”,只有在通过了 Authentication + Authorization 时才会被调用。

所以这句话说你不应该抛出那个异常,因为那是安全组件的工作。这样做不是禁止的,甚至是不可能的,但这不是框架通常被认为的工作方式。

这可能在两种情况下发生:

  1. 您的应用程序很特殊,您需要这样做
  2. 您正在按照框架的方式进行安全工作。这是您的选择,只需评估不使用框架功能的成本/收益并编写您自己的。
于 2013-08-30T20:11:58.723 回答
0

看这里http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html似乎你可以抛出一个返回 403 响应的 AuthenticationException (?)

于 2013-07-23T09:31:12.430 回答
-3

这是 Controller::createNotFoundException() 实现:

public function createNotFoundException($message = 'Not Found', \Exception $previous = null)
{
    return new NotFoundHttpException($message, $previous);
}

它引发了一些不同的异常。

我不知道这个提示的原因。可能是因为在控制器或事件监听器中可以直接返回响应,不会抛出异常从而触发其他事件监听器。

Symfony 使用事件监听器来处理异常。您可以创建自己的侦听器并管理响应。可能对 API 有用。例如,我用它在开发环境中返回漂亮的 json 响应(带有堆栈跟踪和其他调试信息)。

于 2013-07-24T08:56:17.727 回答