在Django站点中保护静态媒体访问

时间:2009-08-27 12:32:02

标签: django apache authentication

我正在建立一个注册用户可以上传文件的网站。然后通过Apache提供这些文件。只有登录的用户才能访问这些文件。

我已阅读this page但似乎每次使用不同类型的登录信息时,人们都必须登录两次以访问网站和媒体。

有没有解决方法或是否有其他方法限制使用Django身份验证数据库访问Apache提供的静态媒体?

我正在使用mod_python。

编辑:在阅读了Van Gale的回答并this后,我最终解决了这个问题:

  1. 切换到WSGI。
  2. 已安装mod_xsendfile
  3. 将所有公共媒体文件移至/ media / public
  4. 中的子文件夹
  5. 使用Alias / media / public / var / www ... / media / public
  6. 添加了对公用文件夹的访问权限
  7. 添加了WSGIScriptAlias / media / protected / /var/www.../apache/django.wsgi(与网站其余部分相同的处理程序)
  8. 添加XSendFile On和XSendFileAllowAbove On
  9. 对于Django应用程序,我为/ media / protected添加了一个urlconf,它基本上只执行了here,仅针对我的身份验证系统进行了修改。它处理诸如/ media / protected / GROUP_ID / file之类的URL,以便只有GROUP的成员才能下载文件。

2 个答案:

答案 0 :(得分:10)

通常的做法是将特殊标头传回Web服务器。

您可以使用nginx使用x-accel-redirect执行此操作,如此Django snippet

对于Apache,使用mod_xsendfile模块(Django用户邮件列表上的discussion and examples)应该非常相似。

答案 1 :(得分:2)

如果您可以自由地从Apache切换到lighttpd,那么最直接的解决方案就是使用mod_secdownload,它可以完全按照您的需要进行操作,即在提供实际服务时提供应用程序身份验证文件通过网络服务器。

但是,如果您遇到Apache,那么我建议mod_auth_token,这里他们提到PHP,但您可以用Python或任何其他语言生成令牌。使用mod_auth_token,您将能够在应用程序中生成令牌,然后让Web服务器使用该令牌为静态文件提供服务。