2012-03-30 26 views
8

Trong dự án Symfony 2 của tôi, tôi có một trang hiển thị thông tin về một thực thể. Trên trang này cũng có một liên kết đến một tập tin liên quan đến thực thể này.Bảo mật liên kết tải xuống trong Symfony 2

Trang được bảo mật và trang này chỉ có thể được hiển thị nếu người dùng là vai trò cụ thể. Vai trò dự kiến ​​là không giống nhau đối với mọi thực thể nên nó được kiểm tra động lực trong Hành động.

Vấn đề của tôi là ngay cả khi trang được bảo mật, bất kỳ ai cũng có thể truy cập tệp thông qua URL của trang. Tôi muốn nó có thể tải xuống chỉ khi vai trò khớp với vai trò để hiển thị trang.

Bất kỳ đề xuất nào về cách tôi nên thực hiện hoặc bắt đầu tìm kiếm ở đâu?

+6

Di chuyển các tập tin bên ngoài của rễ web, và sau đó gửi nó cho người dùng sử dụng 'readfile()', nếu họ đáp ứng được các yêu cầu an ninh để tải về tập tin. – halfer

Trả lời

14

Di chuyển tệp ra ngoài thư mục công khai để không thể truy cập tệp qua URL. Trong bộ điều khiển nếu người dùng có quyền chính xác thì cho phép người dùng tải xuống tệp.

Bạn có thể sử dụng trong điều khiển của bạn:

$headers = array('Content-Type'  => 'application/pdf', 
       'Content-Disposition' => 'inline; filename="file1.pdf"'); 

return new Response(file_get_contents($file), 200, $headers); 
+1

Cảm ơn tôi cũng đã nghĩ về việc triển khai đó một vài giờ sau khi đăng câu hỏi. Tuy nhiên, dù sao nó chắc chắn là cách tốt nhất để làm điều đó! – skwi

+2

Một cải tiến đối với mã ở trên sẽ là sử dụng StreamedResponse để xuất nội dung như một phần của cơ thể SF 2.1 chỉ: http://symfony.com/doc/current/components/http_foundation.html#streaming-a-response – Josiah

+0

bạn nên luôn truyền phát trực tuyến, bởi vì với mã trên máy chủ web của bạn cần phải có nhiều bộ nhớ như kích thước tệp của $ file –

Các vấn đề liên quan