2009-08-27 30 views
13

Tôi đang tạo trang web nơi người dùng đã đăng ký có thể tải lên tệp. Những tập tin đó sau đó được phục vụ thông qua Apache. Chỉ những người dùng đã đăng nhập mới có thể truy cập các tệp đó.Truy cập phương tiện truyền thông tĩnh an toàn trên trang web Django

Tôi đã đọc this page nhưng có vẻ như mọi người sẽ phải đăng nhập hai lần để truy cập cả trang web và phương tiện, mỗi lần sử dụng một loại hộp đăng nhập khác.

Có cách nào xung quanh vấn đề này hoặc có cách nào khác để hạn chế quyền truy cập vào phương tiện tĩnh do Apache cung cấp bằng cơ sở dữ liệu xác thực Django không?

Tôi đang sử dụng mod_python.

EDIT: Làm thế nào tôi đã kết thúc giải quyết này sau khi đọc câu trả lời Văn Gale và this:

  1. Chuyển sang WSGI.
  2. cài đặt mod_xsendfile
  3. chuyển tất cả các tập tin media nào vào một thư mục con trong/media/công
  4. gia tăng quyền truy cập vào các thư mục công cộng sử dụng một Alias ​​/ media//var/www.../media/public công
  5. WSGIScriptAlias ​​thêm/media/bảo vệ//var/www.../apache/django.wsgi (cùng xử lý như đối với phần còn lại của trang web)
  6. Added XSendFile On và XSendFileAllowAbove On
  7. để ứng dụng Django tôi đã thêm một urlconf cho/media/protected mà về cơ bản những gì là here, chỉ sửa đổi cho xác thực của tôi hệ thống phân phối. Nó xử lý các url như/media/protected/GROUP_ID/file để chỉ các thành viên của GROUP mới có thể tải xuống các tệp.
+0

Vấn đề khác có thể xảy ra với cách tiếp cận được mô tả trong tài liệu Django là có vẻ như đang sử dụng xác thực cơ bản - điều này sẽ gửi mật khẩu trong cleartext được mã hóa base64, vì vậy không an toàn trừ khi bạn cũng sử dụng SSL cho tất cả các yêu cầu. –

Trả lời

10

Cách thông thường để thực hiện việc này là trả lại tiêu đề đặc biệt cho máy chủ web.

Bạn có thể làm điều đó với nginx bằng cách sử dụng chuyển hướng nhanh như trong Django snippet này.

Đối với Apache, nó sẽ khá giống với mô-đun mod_xsendfile (discussion and examples trên danh sách gửi thư của người dùng Django).

+0

Tôi sẽ thử mod_xsendfile. –

+0

Nó hoạt động! Đã phải chuyển sang WSGI nhưng điều đó không khó như tôi nghĩ. –

+0

Trong mod_wsgi 3.0, bạn có thể trả lại một Vị trí có 200 trạng thái. Các thư mục cần phải được ánh xạ qua một URL mặc dù, sau đó được tham chiếu trong Vị trí.Vì yêu cầu ánh xạ URL, để đảm bảo các máy khách từ xa không thể truy cập chúng, bạn cần sử dụng quy tắc mod_rewrite để làm cho chúng bị cấm nếu không phải là yêu cầu phụ Apache. Các tùy chọn khác là sử dụng phần mở rộng wsgi.file_wrapper để tối ưu trả về tập tin trực tiếp từ Django. Ngay bây giờ không thể làm điều này với Django, nhưng sẽ được cho phép trong phiên bản tương lai. –

2

Nếu bạn có quyền tự do chuyển từ Apache để lighttpd, sau đó là giải pháp đơn giản nhất là nên sử dụng mod_secdownload đó sẽ làm chính xác những gì bạn muốn, đó là, cung cấp xác thực ứng dụng trong khi phục vụ các tập tin thực tế thông qua máy chủ web.

Tuy nhiên nếu bạn đang mắc kẹt với Apache, thì tôi đề nghị mod_auth_token, ở đây họ đề cập đến PHP nhưng bạn có thể tạo mã thông báo bằng Python hoặc bất kỳ ngôn ngữ nào khác. Sử dụng mod_auth_token, bạn sẽ có thể tạo mã thông báo trong ứng dụng của mình và sau đó có máy chủ web phân phối tệp tĩnh sử dụng mã thông báo đó.

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