Безопасный статический доступ к мультимедиа на сайте 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, вы сможете генерировать токен в своем приложении, а затем использовать веб-сервер для статического файла с использованием этого токена.