django - 为静态站点设置密码保护的最简单方法?

标签 django authentication mod-auth static-site

我有一个静态网站。

我想要用最简单的密码保护目录的方法,以及用于添加/删除用户的基本管理 UI。我将拥有如此少的用户,以至于我不关心性能。

不管是PHP还是Django什么的,我只想要一个完整的软件包。

  • Apache 基本身份验证不好,因为您无法注销。也没有用于添加用户的 UI。

  • 我尝试将所有内容都抛在 Django 身份验证之后,并通过 Django 提供文件。但是,Chrome 将我所有的文本/CSS header 视为文本/纯文本,因此我没有显示任何样式表。

  • 我无法在我的服务器上使用 mod_xsendfile,因为我无法重新配置 Apache 以添加新模块。无论如何,我认为这种方法有点矫枉过正。

有没有实现静态站点basic admin认证的代码包?

最佳答案

我使用 nginx,这通常是我的解决方案。也许与此类似的东西可用于 Apache。不知道。

在 nginx 中,代理可以返回带有 header X-Accel-Redirect 的响应,其中包含 nginx 应该重定向的位置。例如使用以下 nginx 配置:

server {
   ...
   location / {
       proxy_pass: ...;
   }
   location /media/secure/ {
       internal;
       alias ...;
   }
}

如果代理通行证将返回:

X-Accel-Redirect: /media/secure/somefile;

然后 nginx 会将来自代理的请求重定向到 /media/secure/ 位置,从而提供静态文件。

所以我通常在 Django 中对用户进行身份验证,然后将带有位置的 header 返回到 nginx 服务的文件。这很好,因为 Django 不必提供静态文件,用户不能只访问该安全位置(因为 internal 指令),还因为如果所有 mime 类型都在 nginx 中配置,那么所有文件都正确提供...

同样,这是针对 nginx 的,而不是针对 Apache 的,但也许 Apache 也有类似的东西。

编辑

这是一个简单的 Django 代码片段,假设您对 nginx 使用与上述相同的设置。如果 GET 中提供了它的路径,则此 View 提供安全文件:

@login_required()
def serve_secure_static(request, file_root=os.path.join(settings.MEDIA_ROOT, 'secure')):
    if not request.method == 'GET':
        return HttpResponseBadRequest('Only GET allowed')

    if not 'file' in request.GET:
        return HttpResponseBadRequest('File query must be provided')

    # make sire loggen user is allowed to see the file
    # maybe check some custom permission

    file_path = request.GET['file']

    # if in DEBUG, make Django serve static file
    # because nginx might not be configured
    if settings.DEBUG:
        abs_file_path = os.path.join(file_root, file_path)
        file_data = open(abs_file_path, 'rb').read()
        return HttpResponse(file_data, mimetype=mimetypes.guess_type(file_path))

    # else make nginx serve static file
    else:
        redirect_url = '/%s' % file_path
        response = HttpResponse()
        response['X-Accel-Redirect'] = redirect_url
        return response

那么如果您将此 View 添加到 urlconfig:

url(r'^serve_secure_static/$', 'server_secure_static')

您可以通过以下方式请求安全文件:

http://domain.com/serve_secure_static/?file=path/to/file/here/relative/to/media/secure.css

将从中提供文件

/media/secure/path/to/file/here/relative/to/media/secure.css

关于django - 为静态站点设置密码保护的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12488163/

相关文章:

mysql - 如何为与 DBD 和 MySQL 5.1 一起使用的 Apache2 身份验证生成正确的密码格式?

Android 导航损坏

javascript - django 无法将 dictdata 传递到 javascript 变量中

python - django 中的 Modelformset 泛型 CreateView 和 UpdateView

django - Gunicorn 不会从 nginx 记录真实 ip

Django 身份验证失败

php - 在 PHP 中通过 session 设置登录系统

security - 限制使用 .htaccess 文件的安全目录的重试

mysql - 使用 MySQL 在 Apache2 中配置身份验证和授权

django - 如何使必填字段错误消息在 Django 中第一次不显示