Безопасный статический доступ к мультимедиа на сайте Django

Я создаю сайт, на котором зарегистрированные пользователи могут загружать файлы. Эти файлы затем передаются через Apache. Только те пользователи, которые вошли в систему, должны иметь доступ к этим файлам.

Я прочитал эту страницу, но кажется, что людям приходилось дважды входить в систему для доступа к сайту и медиа, каждый раз используя другой тип окна входа.

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

Я использую mod_python.

EDIT. Как я решил это после прочтения ответа Ван Гейла и this:

  • Переключился на WSGI.
  • Установлен mod_xsendfile
  • Переместил все общедоступные медиафайлы в подпапку в /media/public
  • Добавлен доступ к общей папке с использованием Alias ​​/media/public/var/www.../media/public
  • Добавлен WSGIScriptAlias ​​/media/protected//var/www.../apache/django.wsgi(тот же обработчик, что и для остальной части сайта).
  • Добавлен XSendFile On и XSendFileAllowAbove On
  • В приложение Django добавлен urlconf для /media/protected, который в основном использует здесь, только измененный для моей системы аутентификации. Он обрабатывает URL-адреса, такие как /media/protected/GROUP _ID/file, чтобы только члены группы могли загружать файлы.

Ответы

Ответ 1

Обычный способ сделать это - передать специальный заголовок веб-серверу.

Вы можете сделать это с помощью nginx, используя x-accel-redirect, как в этом фрагмент Django.

Для Apache это должно быть довольно похоже, используя модуль mod_xsendfile (обсуждение и примеры в списке рассылки пользователей Django).

Ответ 2

Если у вас есть свобода переключения с Apache на lighttpd, самым простым решением было бы использовать mod_secdownload, который будет делать именно то, что вы хотите, то есть предоставлять аутентификацию приложения, обслуживая фактические файлы через веб-сервер.

Однако, если вы застряли с Apache, я предлагаю mod_auth_token, здесь они упоминают PHP, но вы можете генерировать токен в Python или любой другой язык. Используя mod_auth_token, вы сможете генерировать токен в своем приложении, а затем использовать веб-сервер для статического файла с использованием этого токена.