Вопрос по static, django, media, apache, authentication – Как вам требуется логин для медиафайлов в Django?

26

Я обслуживаю "чувствительный" информация в загружаемых PDF-файлах и таблицах в разделе регистрации пользователя на сайте.

Есть ли способ разрешить аутентификацию Django для защиты этого носителяwithout обслуживать его (и не нужно вручную входить в систему с использованием базовой аутентификации)?

Я догадываюсь, что есть (скрестив пальцы)not способ сделать это с помощью приведенного ниже кода псевдо, но это помогает лучше проиллюстрировать конечную цель.

#urls.py
(r'^protected_media/(?P<filename>.*)$', 'protected_media')

#views.py
from django.contrib.auth.decorators import login_required

@login_required
def protected_media(request, filename):
    # @login_required bounces you out to the login url
    # if logged in, serve "filename" from Apache

Ваш Ответ

4   ответа
3

ango рассматривается как часть проекта Google SOC. Для WSGI это будет использовать расширения wsgi.file_wrapper для WSGI, если они доступны, как и для mod_wsgi, и req.sendfile (), если используется mod_python. Он также будет поддерживать возврат заголовков, таких как «Location», «X-Accel-Redirect». и другие, которые различные механизмы веб-хостинга и внешние прокси-серверы принимают в качестве средства обслуживания статических файлов, где местоположение определяется внутренним веб-приложением, которое не является эффективным в качестве внешнего интерфейса для обслуживания статических файлов.

Я не уверен, есть ли страница проекта для этого в вики Django где-то или нет, но изменения кода фиксируются в ветке ветки / soc2009 / http-wsgi-улучшений репозитория исходного кода Django.

Вам не нужно строго ждать этого материала. Это просто создание чистого и портативного интерфейса между различными механизмами. Если вы используете nginx в качестве внешнего интерфейса перед Apache / mod_wsgi, вы можете использовать X-Accel-Redirect сейчас. Если вы используете Apache / mod_wsgi 3.0 и режим демона, вы можете использовать Location сейчас, но вам нужно убедиться, что вы правильно настроили Apache. В качестве альтернативы вы можете реализовать свою собственную промежуточную программную оболочку WSGI вокруг приложения Django, которая ищет свой собственный заголовок ответа, чтобы указать файл, который должен быть возвращен, и который использует wsgi.file_wrapper, чтобы вернуть его вместо фактического ответа, возвращенного из Django.

Кстати, механизмы ловушки аутентификации, перечисленные как для mod_python, так и для mod_wsgi другими, будут использовать базовую аутентификацию HTTP, а это не то, что вы хотели. Предполагается, что вы хотите, чтобы файлы были защищены механизмом входа в систему на основе форм Django с использованием файлов cookie и внутренних сеансов.

4

Джанго билет для получения дополнительной информации. Начните с нижней части, чтобы сэкономить время. Похоже, что только что пропустил попадание в Django 1.2, и я полагаю, что также не в 1.3.

Для Nginx я нашел этоДжанго фрагмент он использует заголовок X-Accel-Redirect, но еще не пробовал.

1

вы хотите ограничить доступ к файлам, которые не обслуживаются Django, например, с сервера Apache?

Затем вам потребуется, чтобы сервер Apache использовал Django в качестве источника аутентификации.

этоДжанго фрагмент описывает такой метод. Он создает обработчик доступа в Django, который используется Apache, когда поступает запрос на статический файл, который необходимо защитить:

<Location "/protected/location">
            PythonPath "['/path/to/proj/'] + sys.path"  
            PythonOption DJANGO_SETTINGS_MODULE myproj.settings
        PythonOption DjangoPermissionName '<permission.codename>'
        PythonAccessHandler my_proj.modpython #this should point to accesshandler
            SetHandler None
</Location>

Надеюсь, это поможет, фрагмент был опубликован некоторое время назад, поэтому между версиями Django все могло измениться :)

9

что метод, который вы описали в своем коде, должен работать. В действительности он ничем не отличается от любого другого защищенного ресурса: ваши представления могут обслуживать файлы с дисков, записи из баз данных, визуализированные шаблоны или что-либо еще. Так же, как декоратор login_required предотвращает несанкционированный доступ к другим представлениям, он предотвращает такой доступ к вашему представлению, обслуживающему защищенные носители.

Я что-то упустил из вашего вопроса здесь? Пожалуйста, уточните, так ли это.

РЕДАКТИРОВАТЬ: Что касается ссылки django doc в вашем комментарии: это метод простой обработки любого файла запроса из определенного каталога. Итак, в этом примере URL-адреса, такие как/site_media/foo.jpg, /site_media/somefolder/bar.jpg будет автоматически искать файлыfoo.jpg а такжеsomefolder/bar.jpg подdocument_root, В основном, каждая вещь подdocument_root будет общедоступным. Это явно небезопасно. Таким образом, вы избегаете этого своим методом.

Это также считается неэффективным, потому что django просто добавляет много ненужных накладных расходов, когда все, что вам нужно, это что-то вроде Apache, чтобы принять запрос URL и сопоставить его с файлом на жестком диске. (Вам не нужны сеансы django, обработка запросов и т. Д.)

В вашем случае это может быть не такой большой проблемой. Во-первых, вы обеспечили просмотр. Во-вторых, это зависит от ваших моделей использования. Сколько запросов вы ожидаете для этих файлов? Вы используете django только для аутентификации - это оправдывает другие издержки? Если нет, вы можете посмотреть, как эти файлы обслуживать Apache и использовать поставщика аутентификации. Подробнее об этом см.mod_wsgi документация:

http://code.google.com/p/modwsgi/wiki/AccessControlMechanisms see the section "Apache Authentication Provider" and search for django

Есть аналогичные механизмы, доступные подmod_python Я верю. (Обновление: только что заметил другой ответ. Пожалуйста, смотрите ответ Андре дляmod_python Метод.)

РЕДАКТИРОВАТЬ 2: Что касается кода для передачи файла, пожалуйста, посмотрите этот фрагмент:

http://www.djangosnippets.org/snippets/365/

send_file Метод использует FileWrapper, который хорош для отправки больших статических файлов обратно (он не считывает весь файл в память). Вам нужно будет изменитьcontent_type в зависимости от типа файла, который вы отправляете (pdf, jpg и т. д.).

Понял; только что обновил ответ. Надеюсь это поможет.
Эй, Арс, я должен был уточнить, что я пытаюсь опровергнуть следующее беспокойство из django docs:docs.djangoproject.com/en/dev/howto/static-files/…  Если эта строка псевдо-кода является действительной, как вы это делаете? # если вы вошли в систему, введите & quot; имя файла & quot; от Apache Спасибо! TomFuertes

Похожие вопросы