Могу ли я использовать базовую аутентификацию HTTP с Django? - PullRequest
36 голосов
/ 30 сентября 2008

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

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

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

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

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

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

Ответы [ 6 ]

34 голосов
/ 06 июля 2009

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

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

24 голосов
/ 04 мая 2011

Это было добавлено в релиз Django 1.3. Смотрите более актуальную документацию для этого здесь: http://docs.djangoproject.com/en/dev/howto/auth-remote-user/

10 голосов
/ 01 октября 2008

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

Обновление: Протестировано предлагаемое исправление для билета # 689 , которое доступно в настоящее время в git-хранилище telenieko здесь . Это относится чисто по крайней мере на ревизии 9084 Джанго.

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

  • добавление 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.

3 голосов
/ 30 сентября 2008

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

Редактировать: вот более длинная тема с ошибкой по теме .

0 голосов
/ 01 октября 2008

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

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

0 голосов
/ 01 октября 2008

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

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

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

Если патч не работает так, как вы хотите, вы можете довольно быстро реализовать базовую аутентификацию.

...