Установка REMOTE_USER для Trac в Gunicorn позади Nginx

Я выполнил English UK Windows XP and SQL Server Express хорошо. И с британскими и со швейцарскими немецкими клавиатурами также

При установке SQL Server, язык по умолчанию является "us_english". Эта установка независима от локали ОС. Могут быть проблемы с датами, но это, почему у нас есть форматы данных ISO.

Вы имеете в виду "Выпуск N Windows XP", который исчез почти без трассировки...?

5
задан 15 February 2012 в 12:04
2 ответа

Странный. Я получил эту работу, включив this в конфигурацию nginx, как вы упомянули

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

Я предполагаю, что то же самое, вероятно, можно было бы сделать, сделав то же самое только с заголовком запроса' HTTP_AUTHORIZATION ', но я не пытался этого сделать. Так что я не знаю наверняка, все, что я знаю, это то, что сейчас это работает!

5
ответ дан 3 December 2019 в 01:26

У меня была аналогичная проблема с Mercurial; Ответ byoungb, приведенный выше, в принципе в порядке, но следует использовать X-Remote-User , а не REMOTE_USER в proxy_set_header , а затем HTTP_X_REMOTE_USER в вызове Environment.get () .

Однако, поскольку большинство людей используют SSL, а затем выполняют обычную аутентификацию, вы можете использовать заголовок 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. В этом случае вы можете либо сделать то, что предлагает byoungb (хотя и использовать более удачное имя заголовка), либо или вы можете переместить аутентификацию в конец Python, а не заставлять nginx делать это. Обратной стороной последнего является то, что вы можете быть более уязвимыми, если где-то есть дыра в безопасности.

2
ответ дан 3 December 2019 в 01:26

Теги

Похожие вопросы