Форум сайта python.su
Добрый день. Есть вэб приложения куда зарегистрированные/авторизованные пользователи могут загружать файлы. Но есть необходимость, чтобы у этих файлов были права доступа. Т.е ЮЗЕР_1 не имел доступа к файлам, которые загрузил ЮЗЕР_2.
По дефолту джанга грузит файлы в папке /media/ и сам пусть к этой папке прописан в настройках вэб сервера (в моем случае apache), чтобы выдачей статический файлов занимался вэб сервер, а не джанго приложение. Но в таком случае загрузка этих файлов уже будет происходить вне зависимости от авторизован ли пользователь или нет. Как можно реализовать подобную систему? Заранее спасибо.
Офлайн
houndСделайте модель, которая содержит юзера и ссылку на файл и отображаемое имя файла. Реальное имя файла задавайте каким-то длинным рандомным текстом, например uuid. В ссылке пользователю показываете отображаемое имя файла, а url - реальное. Таким образом пользователь не получит чужие файлы, если не начнёт перебирать гуиды, что обречено на провал при достаточно большом количестве знаков.
Как можно реализовать подобную систему? Заранее спасибо.
Офлайн
FishHookРассматривал такой вариант, но опять же тут есть потенциальная “дыра”.
Офлайн
houndэто как раз несложно
Но как тогда организовать чтобы джанго-приложение позволяла скачивать эти файлы?
urlpatterns = [ # ... the rest of your URLconf goes here ... ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Офлайн
лучше уж отдавать самой джангой файл http://django.readthedocs.org/en/latest/howto/outputting-csv.html#streaming-large-csv-files и навернуть проверку прав
или https://bitbucket.org/slav0nic/djangobb/src/9d444c0b11f7099ce337d8d8a14ec6864b0caceb/djangobb_forum/views.py?at=default#cl-825 , но тогда всё будет упираться в размер озу и размер файла
Отредактировано slav0nic (Июль 9, 2015 13:05:37)
Офлайн
Можно проверять права во вьюхе django, а файл отдавать веб-сервером.
Посмотрите след. проекты https://github.com/johnsensible/django-sendfile, http://chibisov.github.io/django-proxy-storage/docs/#authorization, или почитайте статью, например вот эту https://wellfire.co/blog/nginx-django-x-accel-redirects/
В django-sendfile есть бэкенд для apache
Отредактировано svas (Июль 9, 2015 16:08:28)
Офлайн
можно что-то ещё с http://wiki.nginx.org/HttpSecureDownload или http://wiki.nginx.org/HttpAccessKeyModule придумать, чтоб джанга просто ссылки с клчюами генерила, а раздавал nginx
упс, не заменил ссылку на X-Accel-Redirect метод от svas, вполне ничего
Отредактировано slav0nic (Июль 9, 2015 18:14:35)
Офлайн
Решил пока остановиться на django-sendfile. Запустил под апачем, все заработало. Спасибо за совет!
Офлайн
Но возник другой вопрос. По умолчанию джанга сохраняет файлы на сервере в директории, которая указанна в настройках - MEDIA_ROOT (при использовании models.FileField)
Возможно ли менять этот пусть? Например, какие-то файлы сохранять в MEDIA_ROOT, а какие-то другие как PRIVATE_ROOT (для доступа только для авторизованных пользователей).
Офлайн
А если в MEDIA_ROOT сделать вложенный каталог PRIVATE_ROOT?
Офлайн