Уведомления

Группа в Telegram: @pythonsu

#1 Июль 9, 2015 10:05:03

hound
Зарегистрирован: 2014-10-27
Сообщения: 41
Репутация: +  0  -
Профиль   Отправить e-mail  

Права доступа к загруженным файлам

Добрый день. Есть вэб приложения куда зарегистрированные/авторизованные пользователи могут загружать файлы. Но есть необходимость, чтобы у этих файлов были права доступа. Т.е ЮЗЕР_1 не имел доступа к файлам, которые загрузил ЮЗЕР_2.
По дефолту джанга грузит файлы в папке /media/ и сам пусть к этой папке прописан в настройках вэб сервера (в моем случае apache), чтобы выдачей статический файлов занимался вэб сервер, а не джанго приложение. Но в таком случае загрузка этих файлов уже будет происходить вне зависимости от авторизован ли пользователь или нет. Как можно реализовать подобную систему? Заранее спасибо.

Офлайн

#2 Июль 9, 2015 11:44:25

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Права доступа к загруженным файлам

hound
Как можно реализовать подобную систему? Заранее спасибо.
Сделайте модель, которая содержит юзера и ссылку на файл и отображаемое имя файла. Реальное имя файла задавайте каким-то длинным рандомным текстом, например uuid. В ссылке пользователю показываете отображаемое имя файла, а url - реальное. Таким образом пользователь не получит чужие файлы, если не начнёт перебирать гуиды, что обречено на провал при достаточно большом количестве знаков.



Офлайн

#3 Июль 9, 2015 11:48:12

hound
Зарегистрирован: 2014-10-27
Сообщения: 41
Репутация: +  0  -
Профиль   Отправить e-mail  

Права доступа к загруженным файлам

FishHook
Рассматривал такой вариант, но опять же тут есть потенциальная “дыра”.
В идеале если не авторизованный пользователь пытается открыть файл по ссылке, то его должно перекидывать на страницу авторизации.

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

Вариант я тут вижу только один, это не использовать вэб сервер для выдачи загруженных файлов, например данные файлы загружать в другое место проекта не в папку /media/
Но как тогда организовать чтобы джанго-приложение позволяла скачивать эти файлы?

Офлайн

#4 Июль 9, 2015 12:07:38

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Права доступа к загруженным файлам

hound
Но как тогда организовать чтобы джанго-приложение позволяла скачивать эти файлы?
это как раз несложно
urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)



Офлайн

#5 Июль 9, 2015 13:00:50

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

Права доступа к загруженным файлам

лучше уж отдавать самой джангой файл 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)

Офлайн

#6 Июль 9, 2015 16:07:24

svas
От:
Зарегистрирован: 2010-01-27
Сообщения: 239
Репутация: +  9  -
Профиль   Отправить e-mail  

Права доступа к загруженным файлам

Можно проверять права во вьюхе 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)

Офлайн

#7 Июль 9, 2015 18:10:14

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

Права доступа к загруженным файлам

можно что-то ещё с http://wiki.nginx.org/HttpSecureDownload или http://wiki.nginx.org/HttpAccessKeyModule придумать, чтоб джанга просто ссылки с клчюами генерила, а раздавал nginx

упс, не заменил ссылку на X-Accel-Redirect метод от svas, вполне ничего

Отредактировано slav0nic (Июль 9, 2015 18:14:35)

Офлайн

#8 Июль 9, 2015 18:47:45

hound
Зарегистрирован: 2014-10-27
Сообщения: 41
Репутация: +  0  -
Профиль   Отправить e-mail  

Права доступа к загруженным файлам

Решил пока остановиться на django-sendfile. Запустил под апачем, все заработало. Спасибо за совет!

Офлайн

#9 Июль 9, 2015 19:07:29

hound
Зарегистрирован: 2014-10-27
Сообщения: 41
Репутация: +  0  -
Профиль   Отправить e-mail  

Права доступа к загруженным файлам

Но возник другой вопрос. По умолчанию джанга сохраняет файлы на сервере в директории, которая указанна в настройках - MEDIA_ROOT (при использовании models.FileField)

Возможно ли менять этот пусть? Например, какие-то файлы сохранять в MEDIA_ROOT, а какие-то другие как PRIVATE_ROOT (для доступа только для авторизованных пользователей).

Офлайн

#10 Июль 9, 2015 19:22:06

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Права доступа к загруженным файлам

А если в MEDIA_ROOT сделать вложенный каталог PRIVATE_ROOT?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version