linux切换web,为没有sudo的web服务器(django)切换linux用户的最简单方法?

本文探讨了一种在小规模用户环境中,使用FastCGI和Django实现用户特定访问控制的方法。通过为每个用户启动守护进程,结合NGINX的内部重定向,实现了根据登录用户权限定向请求到特定FastCGI进程的安全架构。
摘要由CSDN通过智能技术生成

我不确定处理这个问题的“标准”方法是什么。但是,这是一种简单的技术,适用于拥有少量用户的环境,这些环境不涉及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设置。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值