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 

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.

  • Problemas de Trac (tracd) autônomos
  • Trac causa RuntimeError: instância .__ dict__ não acessível no modo restrito
  • empurrair compromete-se a git (gitolite) repository messes up file permissions (não mais access de trac)
  • O script Upstairt do Ubuntu paira tracd trava no início / fim
  • Como configurair corretamente o Tracd atrás do Nginx?
  • Usando o wget paira obter o site protegido por senha (página do wiki do Trac)
  • TracError: Repositório não encontrado
  • limpe as permissions de file paira o user do trac e git paira acessair o reposto do server gitolite