Форум сайта python.su
0
Добрый день. Есть вэб приложения куда зарегистрированные/авторизованные пользователи могут загружать файлы. Но есть необходимость, чтобы у этих файлов были права доступа. Т.е ЮЗЕР_1 не имел доступа к файлам, которые загрузил ЮЗЕР_2.
По дефолту джанга грузит файлы в папке /media/ и сам пусть к этой папке прописан в настройках вэб сервера (в моем случае apache), чтобы выдачей статический файлов занимался вэб сервер, а не джанго приложение. Но в таком случае загрузка этих файлов уже будет происходить вне зависимости от авторизован ли пользователь или нет. Как можно реализовать подобную систему? Заранее спасибо.
Офлайн
568
houndСделайте модель, которая содержит юзера и ссылку на файл и отображаемое имя файла. Реальное имя файла задавайте каким-то длинным рандомным текстом, например uuid. В ссылке пользователю показываете отображаемое имя файла, а url - реальное. Таким образом пользователь не получит чужие файлы, если не начнёт перебирать гуиды, что обречено на провал при достаточно большом количестве знаков.
Как можно реализовать подобную систему? Заранее спасибо.
Офлайн
0
FishHookРассматривал такой вариант, но опять же тут есть потенциальная “дыра”.
Офлайн
568
houndэто как раз несложно
Но как тогда организовать чтобы джанго-приложение позволяла скачивать эти файлы?
urlpatterns = [ # ... the rest of your URLconf goes here ... ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Офлайн
41
лучше уж отдавать самой джангой файл 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)
Офлайн
9
Можно проверять права во вьюхе 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)
Офлайн
41
можно что-то ещё с http://wiki.nginx.org/HttpSecureDownload или http://wiki.nginx.org/HttpAccessKeyModule придумать, чтоб джанга просто ссылки с клчюами генерила, а раздавал nginx
упс, не заменил ссылку на X-Accel-Redirect метод от svas, вполне ничего
Отредактировано slav0nic (Июль 9, 2015 18:14:35)
Офлайн
0
Решил пока остановиться на django-sendfile. Запустил под апачем, все заработало. Спасибо за совет!
Офлайн
0
Но возник другой вопрос. По умолчанию джанга сохраняет файлы на сервере в директории, которая указанна в настройках - MEDIA_ROOT (при использовании models.FileField)
Возможно ли менять этот пусть? Например, какие-то файлы сохранять в MEDIA_ROOT, а какие-то другие как PRIVATE_ROOT (для доступа только для авторизованных пользователей).
Офлайн
568
А если в MEDIA_ROOT сделать вложенный каталог PRIVATE_ROOT?
Офлайн