Подтвердить что ты не робот

Можно ли использовать базовую аутентификацию HTTP с помощью Django?

У нас есть веб-сайт, работающий на Apache, доступ к которому содержит несколько статических страниц, защищенных с помощью обычной проверки подлинности HTTP.

Я написал новую часть сайта с Django, используя Django, встроенную в поддержку управления пользователями.

Проблема заключается в том, что пользователям приходится регистрироваться один раз с помощью обычной проверки подлинности HTTP, а затем снова с использованием формы входа в Django. Это и неуклюжий, и очень запутанный для пользователей.

Мне было интересно, нашел ли кто-нибудь способ заставить Django регистрировать пользователя с использованием информации об аутентификации HTTP Basic.

Я не ожидаю передать пароль Django, но если пользователь dave был аутентифицирован Apache, то они должны автоматически войти в Django как dave.

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

4b9b3361

Ответ 2

Чтобы просто поддерживать базовые авторизации по некоторым запросам (а не отключать веб-сервер - как это может интерпретировать ваш вопрос), вам нужно посмотреть здесь:

http://www.djangosnippets.org/snippets/243/

Ответ 3

Проверьте ссылки Oli. Вы в основном видите аутентифицированное имя пользователя, подтвержденное базовой HTTP-аутентификацией в Django, просматривая request.META ['REMOTE_USER'].

Обновление: Протестировано предложенное исправление для билета # 689, которое доступно в теленоко git репозиторий здесь. Он применим чисто по крайней мере в редакции 9084 Django.

Активировать бэкэнд аутентификации удаленного пользователя с помощью

  • добавление RemoteUserAuthMiddleware после AuthenticationMiddleware
  • добавление параметра AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.RemoteUserAuthBackend',)

Если вы используете lighttpd и FastCGI, как я, активируйте mod_auth, создайте учетные данные для тестового пользователя (я назвал его testuser и установил 123 в качестве пароля) и настроил сайт Django для базовой аутентификации.

Для тестирования установки можно использовать следующий urls.py:

from django.conf.urls.defaults import *
from django.http import HttpResponse
from django.contrib.auth.models import User
urlpatterns = patterns('',
    url(regex='^$',
        view=lambda request: HttpResponse(repr(request), 'text/plain')),

    url(regex='^user/$',
        view=lambda request: HttpResponse(repr(request.user), 'text/plain')),

    url(regex='^users/$',
        view=lambda request: HttpResponse(
            ','.join(u.username for u in User.objects.all()),
            'text/plain')),
)

После перезагрузки lighty и сервера Django FCGI загрузка корня сайта теперь запрашивает аутентификацию и принимает учетные данные testuser, а затем выводит дамп объекта запроса. В request.META эти новые свойства должны присутствовать:

'AUTH_TYPE': 'Basic'
'HTTP_AUTHORIZATION': 'Basic dGVzdHVzZXI6MTIz'
'REMOTE_USER': 'testuser'

URL /user/ можно использовать для проверки того, что вы действительно вошли в систему как testuser:

<User: testuser>

И теперь в URL /users/ отображается автоматически добавленный testuser (здесь также был показан пользователь admin, который я создал при выполнении syncdb):

admin,testuser

Если вы не хотите исправлять Django, тривиально отделить классы RemoteUserAuthBackend и RemoteUserAuthMiddleware от отдельного модуля и обратиться к ним в настройках Django.

Ответ 4

Существует httpauth.py. Я все еще полный newb с Django, поэтому я не знаю, как он в точности вписывается, но он должен делать то, что вы ищете.

Изменить: здесь длинный поток ошибок на тему.

Ответ 5

Поскольку django можно запускать несколькими способами, и только modpython дает вам тесную интеграцию с Apache, я не верю, что для django существует способ зарегистрировать вас в базовом режиме на основе Apache basic auth. Аутентификация действительно должна выполняться на уровне приложения, так как она даст вам гораздо больше контроля и будет проще. Вы действительно не хотите, чтобы пользователь делился пользовательскими данными между Python и Apache.

Если вы не против использования исправленной версии Django, тогда есть патч в http://www.djangosnippets.org/snippets/56/, который даст вам некоторое промежуточное ПО для поддержки базовой аутентификации.

Базовый auth действительно очень прост - если пользователь не зашел в систему, вы возвращаете код состояния, требующий проверки подлинности 401. Это заставляет браузер отображать окно входа в систему. Затем браузер будет указывать имя пользователя и пароль как строки с кодировкой bas64. Запись в wikipedia http://en.wikipedia.org/wiki/Basic_access_authentication довольно хороша.

Если патч не делает то, что вы хотите, вы можете довольно быстро реализовать основной auth.

Ответ 6

Кажется, это задача для пользовательского AuthenticationBackend - см. документация Django по этому вопросу, djangosnippets.org имеет некоторые реальные примеры такого кода (см. 1 или 2) (и это не очень сложно).

Подклассы

AuthenticationBackend должны иметь только 2 метода, и их код довольно прост: нужно вернуть объект User для идентификатора пользователя, второй должен выполнить проверку учетных данных и вернуть объект User, если учетные данные действительны.