2013-07-23 21 views
9

Tôi vừa phát hiện ra SensioLabsInsight và tìm thấy rất interesting tips về cách viết mã tốt. Nó sẽ là tuyệt vời nếu có một số lời giải thích về lý do tại sao (hoặc tại sao không) một cái gì đó nên được sử dụng - ngay cả đối với những thứ cơ bản như exitdie. Nó sẽ giúp tôi giải thích mọi thứ với những người tôi làm việc cùng.Làm thế nào để tạo ra một phản ứng bị cấm trong Symfony2?

Vì vậy, câu hỏi của tôi là đặc biệt cho AccessDeniedHttpException - nó nói: ứng dụng

Symfony không nên ném AccessDeniedHttpException

Vậy làm thế nào để tôi trở lại 403 Forbidden từ bộ điều khiển ứng dụng hoặc EventListener?
Phương pháp hay nhất là gì?

Thành thật mà nói, tôi nghĩ nó sẽ là

throw new AccessDeniedHttpException() 

Kể từ khi cho 404 bạn có

throw $this->createNotFoundException() 

Nhưng có vẻ như tôi đã sai. (?)

Trả lời

0

Nhìn đây http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html nó có vẻ như bạn có thể có thể ném một AuthenticationException mà trả về một đáp ứng 403

+1

Vâng, trong trường hợp của tôi không trả lại 403, nhưng chuyển hướng đến trang đăng nhập. Nhưng vì tôi đang xây dựng API, tôi cần 403. Tôi đã kiểm tra hành vi nói bây giờ: 'Mã trạng thái phản hồi hiện tại là 200, nhưng 403 được mong đợi.' –

+0

OK, bạn có thể trả lại phản hồi theo cách thủ công như sau: // Trả lại phản hồi HTTP '403 Bị cấm' $ response = new Response(); $ response-> setStatusCode (403); $ event-> setResponse ($ response); Nhưng tôi không biết liệu điều đó có thể áp dụng trong trường hợp cụ thể của bạn hay không. – Tocacar

-3

Đây là điều khiển :: createNotFoundException() thực hiện:

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

Nó ném một bit khác biệt ngoại lệ.

Tôi không biết lý do cho mẹo này. Có lẽ bởi vì trong bộ điều khiển hoặc trình nghe sự kiện Bạn có thể trực tiếp trả về Phản hồi, mà không ném ngoại lệ và do đó kích hoạt các trình xử lý sự kiện khác.

Sử dụng Symfony event listeners to handle exceptions. Bạn có thể tạo người nghe của riêng bạn và quản lý phản hồi. Có thể hữu ích cho API. Ví dụ, tôi đã sử dụng nó để trả về các câu trả lời json khá trong môi trường dev (với stack trace và thông tin gỡ lỗi bổ sung).

+0

Tôi cũng không thấy lý do cho mẹo này. Ứng dụng API của tôi hiện có 2 trình lắng nghe sự kiện, trước tiên là kiểm tra mã thông báo truy cập oauth2 và ném 'UnauthorizedHttpException' => 401 nếu không hợp lệ, thứ hai kiểm tra quyền người dùng và ném' AccessDeniedHttpException' => 403. Và điều này đang hoạt động thực sự tốt. Vì vậy, tôi đoán tip là sai. –

19

Tôi nghĩ điều đó có nghĩa là bạn phải ném AccessDeniedException thay vì trực tiếp ném AccessDeniedHttpException.

Lý do chính là AccessDeniedException bị người nghe sự kiện bắt giữ trong Symfony\Component\Security\Http\Firewall\ExceptionListener và sau đó bạn có thể thực hiện một số nội dung với nó. Kiểm tra chức năng onKernelException.

4

Câu đó phải được xem xét với toàn bộ kiến ​​trúc của Symfony.

Trong khung công tác Symfony có toàn bộ subsystem dành cho bảo mật áp dụng quy trình Xác thực 2 bước + Cấp phép. Điều đó nói trong kiến ​​trúc của Symfony là Controllers, đó là những gì cơ bản mà khung làm việc để bạn phát triển và do đó chúng là "ứng dụng", sẽ được gọi chỉ khi Xác thực + Cấp phép đã được thông qua.

Vì vậy, câu đó nói rằng bạn không cần phải ném ngoại lệ đó vì đó là công việc cho thành phần Bảo mật.Làm điều đó không bị cấm hoặc thậm chí là không thể thực hiện được nhưng nó không phải là cách mà khung làm việc bình thường được suy nghĩ để làm việc.

Điều này có thể xảy ra trong hai trường hợp:

  1. ứng dụng của bạn là đặc biệt và bạn cần phải làm theo cách đó
  2. Bạn đang làm công tác an ninh ra khỏi con đường khuôn khổ làm. Đó là sự lựa chọn của bạn, chỉ cần đánh giá chi phí/lợi ích của việc không sử dụng các tính năng của khung công tác và viết các tính năng của riêng bạn.
Các vấn đề liên quan