我不确定处理这个问题的“标准”方法是什么。但是,这是一种简单的技术,适用于拥有少量用户的环境,这些环境不涉及sudo,也不需要更改web服务器内部的UID(对于多个用户并发访问,这很可能是一个非常问题)。在
为每个有权访问此应用程序的用户启动守护进程。这个过程本身应该通过FastCGI(替代您选择的协议)为该用户提供web请求。您的web服务器应该有一些用户到端口号的映射。然后,根据Django用户使用的登录,将网关的请求重定向到正确的FastCGI进程。在
示例(使用NGINX的internal重定向,假设使用FastCGI设置):用户foo登录到Django web应用程序
用户请求页/.../
Django应用程序接收用户/.../的请求foo
Django应用程序返回自定义HTTP头^{},指示内部重定向到/delegate/foo/.../。在
NGINX forwards查找与端口9000上的FastCGI处理程序关联的位置/delegate/foo/
FastCGI处理程序以用户foo身份运行,并授予对主目录中内容的访问权。在
您可以将web服务器和通信协议替换为您选择的组合。我在这里使用FastCGI是因为它允许将网关和处理程序都作为Django应用程序编写。我选择NGINX是因为internal重定向特性。这可以防止非foo用户直接使用/delegate/foo/.../url进行模拟。在
更新
示例:
假设您有flup模块,那么可以直接使用Django启动FastCGI服务器。要在特定用户帐户下通过FastCGI启动Django应用程序,可以使用:sudo -u $user python /absolute/path/to/manage.py runfcgi host=127.0.0.1 port=$port
用$user代替用户名,$port代替该用户的唯一端口(没有两个用户可以共享同一个端口)。在
假设是NGINX配置,可以设置如下:
^{pr2}$
确保为上面的每个$user和$port组合添加一个这样的指令。在
然后,从您的前端Django应用程序中,您可以使用以下命令检查权限和内容:@login_required
def central_dispatch_view ( request ):
response = HttpResponse()
response['X-Accel-Redirect'] = '/user/'+request.user.username
return response
免责声明:这是完全未经测试的,而且在最初的答案发布将近一年之后,我不确定这是否可行,主要是因为NGINX中关于XSendFile的文档指定这应该与静态文件一起使用。我还没有进一步询问您是否可以从FastCGI应用程序执行内部NGINX重定向。在
替代方案:
更好的方法可能不涉及内部重定向,而是使用FastCGI授权程序。基本上,FastCGI是web服务器在服务请求之前运行的程序。然后,您可以绕过隐藏的内部重定向,只需要一个FastCGI授权器来检查访问/user/foo/的请求是否可以来自以foo身份登录的Django用户。这个授权程序不能作为Django应用程序运行(因为这不是HTTP请求/响应周期),但是您可以使用flup编写它并访问Django设置。在