Безопасный статический медиа-доступ на сайте Django - PullRequest
14 голосов
/ 27 августа 2009

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

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

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

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

РЕДАКТИРОВАТЬ : Как я решил эту проблему после прочтения ответа Ван Гейла и этого :

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

Ответы [ 2 ]

10 голосов
/ 27 августа 2009

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

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

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

2 голосов
/ 27 августа 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...