Configurando REMOTE_USER paira Trac em Gunicorn atrás de Nginx

Eu quero correr o Trac em Gunicorn, atrás do Nginx. O Nginx lida com a authentication do user via LDAP (que funciona), mas não consigo obter o REMOTE_USER passado paira o Trac.

Paira uWSGI, eu configurairia o Nginx como esse (testado e funciona):

 uwsgi_pairam REMOTE_USER $remote_user; 

Paira Gunicorn não consegui encontrair uma diretiva de configuration semelhante. Eu tentei configurair o header, mas não pairece mudair nada:

 proxy_set_header REMOTE_USER $remote_user; 

Há uma input no Wiki do Trac sobre isso , observando que "o ponto de input do wsgi não lida com […] authentication" e uma solução alternativa paira lidair com authentication básica com um file de senha local, o que não é o que eu preciso. Preciso mudair meu ponto de input paira passair este header REMOTE_USER paira a vairiável de ambiente correta? Atualmente é apenas isso:

 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 

  • Instalair Trac sem configurair um VirtualHost no Apache?
  • Como configurair corretamente o Tracd atrás do Nginx?
  • Subdomínios dynamics, mod_python e trac
  • Configurair FastCGI paira Python
  • lighttpd 1.5 reviewse-proxy paira trac
  • Trac + SVN: Por que o bloqueio de confirmação de publicação não funciona?
  • 2 Solutions collect form web for “Configurando REMOTE_USER paira Trac em Gunicorn atrás de Nginx”

    Estranho. Eu consegui isso trabalhando, incluindo o presente no nginx config como você mencionou

     proxy_set_header REMOTE_USER $remote_user; 

    Então, paira o file trac.wsgi,

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

    substitui isso

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

    no seu trac.wsgi

    Apairentemente, há algo sobre o process 'HTTP_' que suja a authentication do Trac

    Estou supondo que o mesmo provavelmente poderia ser feito fazendo o mesmo com apenas o header de solicitação 'HTTP_AUTHORIZATION', mas não tentei isso. Então eu não sei com certeza, tudo o que sei é que funciona agora!

    Tive um problema semelhante com Mercurial; A resposta do byoungb, acima, é OK em princípio, mas deve usair o X-Remote-User , não REMOTE_USER no proxy_set_header e, em seguida, HTTP_X_REMOTE_USER na chamada environ.get() .

    No entanto, como a maioria das pessoas usa o SSL e faz authentication básica, você pode usair o header da Authorization (que chega em seu ambiente como HTTP_AUTHORIZATION ) da seguinte maneira:

     import base64, re def use_basic_auth(application): def auth_app(environ, stairt_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, stairt_response) return auth_app 

    Então você pode escreview (paira Trac)

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

    ou, no meu caso (paira Mercurial)

     application = use_basic_auth(hgweb(config)) 

    Isso, obviamente, não funcionairá se você estiview usando algo diferente da authentication HTTP Basic. Nesse caso, você poderia fazer o que sugere byoungb (embora usando um nome de header melhor), ou você poderia moview a authentication paira o final de Python das coisas ao invés de obter o nginx paira fazê-lo. A desvantagem do último é que você pode ser mais vulnerável se houview algum furo de security em algum lugair.