Ответ 1
Это добавлено в версию Django 1.3. Более подробную документацию можно найти здесь: http://docs.djangoproject.com/en/dev/howto/auth-remote-user/
У нас есть веб-сайт, работающий на Apache, доступ к которому содержит несколько статических страниц, защищенных с помощью обычной проверки подлинности HTTP.
Я написал новую часть сайта с Django, используя Django, встроенную в поддержку управления пользователями.
Проблема заключается в том, что пользователям приходится регистрироваться один раз с помощью обычной проверки подлинности HTTP, а затем снова с использованием формы входа в Django. Это и неуклюжий, и очень запутанный для пользователей.
Мне было интересно, нашел ли кто-нибудь способ заставить Django регистрировать пользователя с использованием информации об аутентификации HTTP Basic.
Я не ожидаю передать пароль Django, но если пользователь dave
был аутентифицирован Apache, то они должны автоматически войти в Django как dave
.
(Один из вариантов заключается в том, чтобы Apache и Django совместно использовать хранилище пользователей для обеспечения общих имен пользователей и паролей, но это все равно будет включать в себя два запроса на вход, которые я пытаюсь избежать.)
Это добавлено в версию Django 1.3. Более подробную документацию можно найти здесь: http://docs.djangoproject.com/en/dev/howto/auth-remote-user/
Чтобы просто поддерживать базовые авторизации по некоторым запросам (а не отключать веб-сервер - как это может интерпретировать ваш вопрос), вам нужно посмотреть здесь:
Проверьте ссылки 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.
Существует httpauth.py. Я все еще полный newb с Django, поэтому я не знаю, как он в точности вписывается, но он должен делать то, что вы ищете.
Изменить: здесь длинный поток ошибок на тему.
Поскольку 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.
Кажется, это задача для пользовательского AuthenticationBackend
- см. документация Django по этому вопросу, djangosnippets.org имеет некоторые реальные примеры такого кода (см. 1 или 2) (и это не очень сложно).
AuthenticationBackend
должны иметь только 2 метода, и их код довольно прост: нужно вернуть объект User для идентификатора пользователя, второй должен выполнить проверку учетных данных и вернуть объект User, если учетные данные действительны.