Найти - Пользователи
Полная версия: Права доступа к загруженным файлам
Начало » Django » Права доступа к загруженным файлам
1 2
hound
Добрый день. Есть вэб приложения куда зарегистрированные/авторизованные пользователи могут загружать файлы. Но есть необходимость, чтобы у этих файлов были права доступа. Т.е ЮЗЕР_1 не имел доступа к файлам, которые загрузил ЮЗЕР_2.
По дефолту джанга грузит файлы в папке /media/ и сам пусть к этой папке прописан в настройках вэб сервера (в моем случае apache), чтобы выдачей статический файлов занимался вэб сервер, а не джанго приложение. Но в таком случае загрузка этих файлов уже будет происходить вне зависимости от авторизован ли пользователь или нет. Как можно реализовать подобную систему? Заранее спасибо.
FishHook
hound
Как можно реализовать подобную систему? Заранее спасибо.
Сделайте модель, которая содержит юзера и ссылку на файл и отображаемое имя файла. Реальное имя файла задавайте каким-то длинным рандомным текстом, например uuid. В ссылке пользователю показываете отображаемое имя файла, а url - реальное. Таким образом пользователь не получит чужие файлы, если не начнёт перебирать гуиды, что обречено на провал при достаточно большом количестве знаков.
hound
FishHook
Рассматривал такой вариант, но опять же тут есть потенциальная “дыра”.
В идеале если не авторизованный пользователь пытается открыть файл по ссылке, то его должно перекидывать на страницу авторизации.

Например, как это сделано в приложении redmine. Там если попытаться открыть файл по прямой ссылке не авторизованным пользователем, то его перекидывают на страницу авторизации.

Вариант я тут вижу только один, это не использовать вэб сервер для выдачи загруженных файлов, например данные файлы загружать в другое место проекта не в папку /media/
Но как тогда организовать чтобы джанго-приложение позволяла скачивать эти файлы?
FishHook
hound
Но как тогда организовать чтобы джанго-приложение позволяла скачивать эти файлы?
это как раз несложно
urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
slav0nic
лучше уж отдавать самой джангой файл 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 , но тогда всё будет упираться в размер озу и размер файла
svas
Можно проверять права во вьюхе 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
slav0nic
можно что-то ещё с http://wiki.nginx.org/HttpSecureDownload или http://wiki.nginx.org/HttpAccessKeyModule придумать, чтоб джанга просто ссылки с клчюами генерила, а раздавал nginx

упс, не заменил ссылку на X-Accel-Redirect метод от svas, вполне ничего
hound
Решил пока остановиться на django-sendfile. Запустил под апачем, все заработало. Спасибо за совет!
hound
Но возник другой вопрос. По умолчанию джанга сохраняет файлы на сервере в директории, которая указанна в настройках - MEDIA_ROOT (при использовании models.FileField)

Возможно ли менять этот пусть? Например, какие-то файлы сохранять в MEDIA_ROOT, а какие-то другие как PRIVATE_ROOT (для доступа только для авторизованных пользователей).
FishHook
А если в MEDIA_ROOT сделать вложенный каталог PRIVATE_ROOT?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB