在Nginx后面的Gunicorn中为Trac设置REMOTE_USER

我希望在Nginx后面的Gunicorn运行Trac。 Nginx通过LDAP处理用户身份validation,但是我无法将REMOTE_USER传递给Trac。

对于uWSGI我会像这样configurationNginx(经过testing,工作正常):

 uwsgi_param REMOTE_USER $remote_user; 

对于Gunicorn,我找不到类似的configuration指令。 我试图设置标题,但它似乎并没有改变任何东西:

 proxy_set_header REMOTE_USER $remote_user; 

在Trac wiki中有一个关于这个的条目 ,指出“wsgi入口点不处理authentication ,以及一个用本地密码文件处理基本authentication的解决方法,这不是我所需要的。 我是否需要更改我的入口点以将此REMOTE_USER标头传递给正确的环境variables? 目前只是这样的:

 import sys import os sys.stdout = sys.stderr os.environ['TRAC_ENV'] = '/path/to/my/trac' import trac.web.main application = trac.web.main.dispatch_request 

奇怪的一个。 通过在你提到的nginxconfiguration中包含这个,我得到了这个工作

 proxy_set_header REMOTE_USER $remote_user; 

然后为这个trac.wsgi文件

 import trac.web.main def application(environ, start_application): environ['REMOTE_USER'] = environ.get('HTTP_REMOTE_USER') return trac.web.main.dispatch_request(environ, start_application) 

取代这一点

 import trac.web.main application = trac.web.main.dispatch_request 

在你的trac.wsgi

显然有一些关于进行“HTTP_”的事情弄乱了trac的authentication

我猜测同样的事情可能是通过做'HTTP_AUTHORIZATION'请求头相同的事情,但我没有尝试。 所以我不知道,所有我知道的是,它现在的作品!

我和Mercurial有类似的问题。 上面的byoungb的答案原则上可以,但是应该使用X-Remote-User ,而不是proxy_set_header REMOTE_USER ,然后是environ.get()调用中的environ.get()

但是,由于大多数人使用SSL,然后执行基本身份validation,因此可以使用Authorization头(作为HTTP_AUTHORIZATION到达您的环境中),如下所示:

 import base64, re def use_basic_auth(application): def auth_app(environ, start_response): auth = environ.get('HTTP_AUTHORIZATION') if auth: scheme, creds = re.split(r'\s+', auth) if scheme.lower() != 'basic': raise ValueError('Unknown auth scheme \"%s\"' % scheme) user, pword = base64.b64decode(creds).split(':', 1) environ['REMOTE_USER'] = user return application(environ, start_response) return auth_app 

那么你可以写(对于Trac)

 application = use_basic_auth(trac.web.main.dispatch_request) 

或者在我的情况下(对于Mercurial)

 application = use_basic_auth(hgweb(config)) 

如果您使用的不是HTTP基本身份validation,这显然不起作用。 在这种情况下,你可以做任何byoungbbuild议(尽pipe使用更好的头名称),或者你可以移动身份validation到Python的结束,而不是让nginx来做到这一点。 后者的缺点是,如果某处存在安全漏洞,则可能会更加脆弱。