2012-03-21 34 views
6

Tôi đang xây dựng một hệ thống cho phép người dùng tạo tài liệu và sau đó tải chúng xuống. Tài liệu là các tệp PDF (không phải là vấn đề vì lợi ích của câu hỏi này) và khi chúng được tạo, tôi lưu trữ chúng trên hệ thống tệp cục bộ của mình mà máy chủ web đang chạy với các tên tệp uuidGiới hạn quyền truy cập vào các tệp tĩnh ở Django/Nginx

c7d43358-7532-4812- b828-b10b26694f0f.pdf

nhưng tôi biết "an ninh thông qua tối tăm" không phải là giải pháp đúng ...

tôi muốn hạn chế quyền truy cập vào tập tin họ trên một cơ sở cho mỗi tài khoản nếu có thể. Một điều tôi nghĩ rằng tôi có thể làm là tải chúng lên S3 và cung cấp một URL đã ký, nhưng tôi muốn tránh điều đó ngay bây giờ nếu có thể.

Tôi đang sử dụng Nginx/Django/Gunicorn/EC2/S3

Một số giải pháp khác là gì?

Trả lời

3

Cách thực thi user==owner ở cấp chế độ xem, ngăn quyền truy cập vào tệp, lưu trữ chúng dưới dạng tệp FileFields và chỉ truy xuất tệp nếu điều kiện đó được đáp ứng.

ví dụ: Bạn có thể sử dụng @login_requireddecorator trên chế độ xem để chỉ cho phép truy cập nếu đã đăng nhập. Điều này có thể được tinh chỉnh bằng cách sử dụng request.user để kiểm tra chủ sở hữu của tệp. Phần Xác thực người dùng của Django documentation có thể hữu ích ở đây.

Tùy chọn khác, như bạn đề cập là thông qua S3, tạo các url trong Django có chuỗi truy vấn cho phép người dùng được xác thực truy cập tải xuống một đối tượng s3 cụ thể với giới hạn thời gian. Thông tin chi tiết về điều đó có thể được tìm thấy tại số s3 documentation. Một câu hỏi tương tự đã được hỏi trước here trên SO.

1

Tôi đã sử dụng django-private-files với thành công lớn, nó thực thi bảo vệ ở cấp chế độ xem và sử dụng các phần phụ trợ khác nhau để thực hiện truyền tệp thực tế.

10

Nếu bạn đang phục vụ các tệp nhỏ, bạn thực sự có thể sử dụng Django để phục vụ chúng trực tiếp, ghi tệp vào đối tượng HttpResponse.

Nếu bạn đang phục vụ các file lớn tuy nhiên, bạn có thể muốn để lại nhiệm vụ đó lên máy chủ web, bạn có thể sử dụng X-Accel-Redirect tiêu đề trên Nginx (và cho Apache & Lighttpd) để có máy chủ web phục vụ các tập tin cho bạn.

Bạn có thể tìm thêm thông tin về chính tiêu đề in Nginx's documentation here và bạn có thể tìm thấy some inspiration as to how to use that in Django here.

Khi bạn đã hoàn tất gửi tệp qua chế độ xem Django, việc thực thi xác thực người dùng phải khá thẳng thắn khi sử dụng khung công tác xác thực của Django.

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