Помощь с Django RemoteUserMiddleware RemoteUserBackend с новой базой данных - PullRequest
3 голосов
/ 04 мая 2011

Django версии 1.3 включает в себя RemoteUserMiddleware и RemoteUserBackend классы, позволяющие Apache выполнять аутентификацию. Смотри http://docs.djangoproject.com/en/dev/howto/auth-remote-user/

У меня есть initial_data.json, который создает суперпользователя при выполнении syncdb. Это подтверждают дампданные.

Но я обнаружил, что он, кажется, не входит в систему с недавно созданной базой данных. Я получаю исключение ImproperlyConfigured, которое говорит: Промежуточное программное обеспечение для аутентификации удаленного пользователя Django требует установки промежуточного программного обеспечения для аутентификации.

Edit your MIDDLEWARE_CLASSES setting to insert django.contrib.auth.middleware.AuthenticationMiddleware' before the RemoteUserMiddleware class.

Трассировка указывает на RemoteMilddleware.process_request():

def process_request(self, request):
    # AuthenticationMiddleware is required so that request.user exists.
    if not hasattr(request, 'user'):
        raise ImproperlyConfigured(...

Вывод DEBUG от Apache показывает, что в действительности настройки имеют AuthenticationMiddleware и RemoteUserMiddleware в запрошенном порядке:

MIDDLEWARE_CLASSES  
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.RemoteUserMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')

Но атрибут request.user не установлен, генерируя исключение.

Если я посмотрю ближе на исходный код django.contrib.auth.backends и middleware, Я считаю, что AuthenticationMiddleware регистрируется LazyUser для класс запроса. Но RemoteUserBackend, похоже, не имеет вызванный метод authenticate (), в котором удаленный_пользователь ищется в таблице Users.

Есть ли что-то, что я должен сделать, чтобы заставить authenticate() быть вызванным для создания request.user?

Я могу предоставить больше информации по мере необходимости. Кстати, это SSL. Есть ли какое-то взаимодействие, которого я не ожидал?

Следует отметить, что я использую Apache2.2.14 и mod_wsgi.

Ответы [ 2 ]

2 голосов
/ 03 мая 2012

У меня была такая же проблема, и после небольшой отладки я забыл создать таблицы mysql (я думаю, что то же самое с sqllite) для auth и других приложений.Поэтому, если вы этого не сделаете, вам нужно будет запустить python manage.py syncdb или создать их другим способом

0 голосов
/ 05 мая 2011

Это уродливый обходной путь.

Я создал тестовый блок, и он отлично работал в стандартной среде разработки. Исходя из этого, я вошел в функцию RemoteMilddleware.process_request(), упомянутую выше на сервере Apache, и отключил проверку атрибута user. Затем он работал нормально ...

Я не собираюсь выбирать это в качестве ответа, но я подумал, что должен документировать этот обходной путь для всех, кто заблокирован. Я посмотрю на сообщение об ошибке.

Кто-нибудь знает правильное решение или как атаковать это в Apache2? Вся информация о трассировке и переменных говорит о том, что Apache правильно настраивает REMOTE_USER, но Django1.3 неправильно использует его для аутентификации.

...