Impostare REMOTE_USER per Trac in Gunicorn dietro Nginx

Voglio eseguire Trac a Gunicorn, dietro Nginx. Nginx gestisce l'authentication dell'utente tramite LDAP (che funziona), ma non posso get il REMOTE_USER passato a Trac.

Per uWSGI configurerei Nginx come questo (testato e funziona):

 uwsgi_param REMOTE_USER $remote_user; 

Per Gunicorn non riuscivo a trovare una direttiva di configuration simile. Ho provato a impostare l'intestazione, ma non sembra cambiare nulla:

 proxy_set_header REMOTE_USER $remote_user; 

C'è una voce nella wiki Trac riguardo a questo , rilevando che "il punto di ingresso wsgi non gestisce l'authentication […] e una soluzione per gestire l'authentication di base con un file di password locale, che non è quello di cui ho bisogno. Devo cambiare il mio punto di ingresso per passare questa intestazione REMOTE_USER alla giusta variabile di ambiente? Attualmente è solo questo:

 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 

  • Collegamenti Python SVN - ImportError: Nessun module denominato svn
  • Configurare FastCGI per Python
  • È ansible installare un'istanza di Trac per più progetti indipendenti?
  • Trac + SVN: perché il post hook di commit non funziona?
  • TracError: il repository non è stato trovato
  • fcgid, suexec e userdir
  • SVN / Trac - OPTIONS reponse non ha incluso il set di raccolta attività richiesto
  • impostare tracd dietro mod_proxy?
  • 2 Solutions collect form web for “Impostare REMOTE_USER per Trac in Gunicorn dietro Nginx”

    Strano. Ho ottenuto questo lavoro inserendo questo nella configuration nginx come hai detto

     proxy_set_header REMOTE_USER $remote_user; 

    Quindi per il file trac.wsgi questo

     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) 

    sostituisce questo

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

    nella tua traccia

    Apparentemente c'è qualcosa sul procedimento 'HTTP_' che scompiglia l'auth del trac

    Sto indovinando che la stessa cosa probabilmente potrebbe essere compiuta facendo la stessa cosa al solo 'intestazione HTTP_AUTHORIZATION' richiesta, ma non l'ho tentato. Quindi non so per certo, tutto quello che so è che funziona adesso!

    Ho avuto un problema simile con Mercurial; La risposta di byoungb, sopra, è OK in linea di principio, ma dovrebbe utilizzare X-Remote-User , non REMOTE_USER nel proxy_set_header e quindi HTTP_X_REMOTE_USER nella chiamata environ.get() .

    Tuttavia, poiché la maggior parte delle persone utilizza SSL e quindi fa l'authentication di base, è ansible utilizzare l'intestazione di Authorization (che arriva nel proprio ambiente come HTTP_AUTHORIZATION ) come segue:

     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 

    Poi puoi scrivere (per Trac)

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

    o, nel mio caso (per Mercurial)

     application = use_basic_auth(hgweb(config)) 

    Questo ovviamente non funziona se si utilizza qualcosa di diverso dall'authentication HTTP Basic. In questo caso, potresti fare quello che suggerisce byoungb (anche se usando un nome di intestazione migliore), oppure puoi spostare l'authentication all'estremità di Python delle cose piuttosto che get nginx per farlo. Il lato negativo di quest'ultimo è che potresti essere più vulnerabile se c'è qualche foro di sicurezza da qualche parte.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.