2013-07-23 28 views
9

我剛剛發現了SensioLabsInsight,發現如何編寫優質代碼的代碼非常多interesting tips。如果爲什麼(或爲什麼不)應該使用某種解釋會很好,即使對於像exitdie這樣的基本東西也是如此。這有助於我向與之合作的人解釋事情。如何在Symfony2中創建禁止響應?

所以我的問題是專門爲AccessDeniedHttpException - 它說:

Symfony的應用程序不應該拋出AccessDeniedHttpException

那麼,如何返回403從應用程序控制器或事件監聽紫禁城?
最佳做法是什麼?

說實話,我認爲這將是

throw new AccessDeniedHttpException() 

由於爲404你有

throw $this->createNotFoundException() 

但它看起來像我錯了。 (?)

回答

0

看這裏http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html好像你也許可以扔它返回一個403響應的的AuthenticationException

+1

那麼,在我的情況下,它不返回403,但重定向到登錄頁面。但是因爲我正在構建API,所以我確實需要403.我現在正在測試說:'當前的響應狀態代碼是200,但是預期爲403.# –

+0

好的,您可以手動返回如下響應://返回'403 Forbidden'HTTP響應 $ response = new Response(); $ response-> setStatusCode(403); $ event-> setResponse($ response);但我不知道這是否適用於您的特殊情況。 – Tocacar

-3

這裏是控制器:: createNotFoundException()實現:

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

它拋出一個有點不同的例外。

我不知道這個提示的原因。也許它是因爲在控制器或事件監聽器中你可以直接返回Response,而不會拋出異常,從而觸發其他事件監聽器。

Symfony使用event listeners to handle exceptions。您可以創建自己的監聽器並管理響應。可能對API有用。例如,我用它在開發環境中返回漂亮的json響應(帶有堆棧跟蹤和附加的調試信息)。

+0

我沒有看到這個提示的原因。我的API應用程序當前有2個事件偵聽器,首先檢查oauth2訪問令牌,如果無效則拋出'UnauthorizedHttpException' => 401,然後檢查用戶權限並拋出'AccessDeniedHttpException' => 403。這真的很好。所以我認爲這個提示是錯誤的。 –

4

這句話必須考慮到Symfony的整個架構。

在Symfony框架中,整個subsystem致力於安全應用2步驗證+授權過程。 這就是說,在Symfony的體系結構中,Controllers,基本上是框架留給你開發的東西,所以它們是「應用程序」,只有在認證+授權已通過時纔會被調用。

所以這句話說,你不應該拋出該異常,因爲這是安全組件的工作。這樣做不是被禁止的,甚至是不可能的,但這並不是框架通常被認爲可行的方式。

這可以在兩種情況下發生:

  1. 您的應用程序特定的,你需要做的方式
  2. 你是做安保工作出這樣的框架的方式。這是您的選擇,只需評估不使用框架功能並編寫您自己的功能的成本/收益。