2012-03-21 4 views
6

Я создаю систему, которая позволяет пользователям создавать документы, а затем загружать их. Документы являются PDF-файлами (не для того, чтобы это было важно для этого вопроса), и когда они сгенерированы, я храню их в локальной файловой системе, с которой работает веб-сервер с именами файлов uuid.Ограничение доступа к статическим файлам в Django/Nginx

c7d43358-7532-4812- b828-b10b26694f0f.pdf

, но я знаю, что «безопасность через неизвестность» не является правильным решение ...

Я хочу, чтобы ограничить доступ к их файлам на каждый аккаунт, если это возможно. Одна вещь, которую я могу сделать, это загрузить их на S3 и предоставить подписанный URL-адрес, но я хочу избежать этого, если это возможно.

Я использую Nginx/Django/Gunicorn/EC2/S3

Какие другие решения?

ответ

3

Как насчет соблюдения user==owner на уровне представления, предотвращая доступ к файлам, сохраняя их как FileFields и получая только файл, если это условие выполнено.

например. Вы можете использовать @login_requireddecorator на вид, чтобы разрешить доступ только при входе в систему. Это можно уточнить с помощью request.user, чтобы проверить его владельца. Раздел User Auth в Django documentation, вероятно, будет полезен здесь.

Другой вариант, как вы упомянули, через S3, генерируя URL-адреса в Django, у которых есть запрос, позволяющий аутентифицированному пользователю получить доступ к определенному объекту s3 с ограничением по времени. Подробности об этом можно найти на странице s3 documentation. Аналогичный вопрос задан до here на SO.

1

Я использовал django-private-files с большим успехом, он обеспечивает защиту на уровне представления и использует разные backend для фактической передачи файлов.

10

Если вы обслуживаете небольшие файлы, вы можете использовать Django для их непосредственного использования, записывая файл в объект HttpResponse.

Если вы обслуживаете большие файлы, однако, вы можете оставить эту задачу на свой веб-сервер, вы можете использовать X-Accel-Redirect заголовок на Nginx (и для Apache & Lighttpd), чтобы ваш веб-сервер служит для вас файл.

Вы можете найти более подробную информацию о самом заголовке in Nginx's documentation here, и вы можете найти some inspiration as to how to use that in Django here.

Как только вы закончите отправку файлов через представления Django, принудительная аутентификация пользователей должна быть довольно прямолинейной, используя инфраструктуру auth Django.

Смежные вопросы