Могу ли я использовать базовую аутентификацию HTTP с Django?
-
02-07-2019 - |
Вопрос
У нас есть веб-сайт, работающий на 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/
Другие советы
Чтобы просто поддерживать базовую аутентификацию для некоторых запросов (а не возиться с веб-сервером - как кто-то может интерпретировать заголовок вашего вопроса), вам нужно посмотреть здесь:
Проверьте ссылки Оли.По сути, вы видите аутентифицированное имя пользователя, подтвержденное базовой 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'
А /user/
URL-адрес можно использовать для проверки того, что вы действительно вошли в систему как testuser
:
<User: testuser>
И /users/
В URL-адресе теперь перечислены автоматически добавленные testuser
(здесь admin
пользователь, которого я создал при выполнении syncdb
также показано):
admin,testuser
Если вы не хотите исправлять Django, достаточно просто отсоединить RemoteUserAuthBackend
и RemoteUserAuthMiddleware
классы в отдельный модуль и укажите это в настройках Django.
Есть httpauth.py.Я все еще новичок в Django, поэтому понятия не имею, как именно он вписывается, но он должен делать то, что вы ищете.
Редактировать:вот более длинная тема об ошибках по этой теме.
Поскольку django можно запускать несколькими способами, и только modpython обеспечивает тесную интеграцию с Apache, я не верю, что у django есть способ зарегистрировать вас в базовой системе с базовой аутентификацией Apache.Аутентификацию действительно следует выполнять на уровне приложения, поскольку это даст вам гораздо больше контроля и будет проще.Вам действительно не нужны хлопоты по обмену пользовательскими данными между Python и Apache.
Если вы не против использовать исправленную версию Django, патч можно найти по адресу http://www.djangosnippets.org/snippets/56/ который даст вам некоторое промежуточное программное обеспечение для поддержки базовой аутентификации.
Базовая аутентификация на самом деле довольно проста: если пользователь не вошел в систему, вы возвращаете код состояния, необходимый для аутентификации 401.Это побуждает браузер отобразить окно входа в систему.Затем браузер предоставит имя пользователя и пароль в виде строк в кодировке bas64.Запись в Википедии http://en.wikipedia.org/wiki/Basic_access_authentication это довольно хорошо.
Если патч не делает то, что вы хотите, вы можете довольно быстро реализовать базовую аутентификацию самостоятельно.
Похоже это задача для кастомов AuthenticationBackend
- видеть Документация Django по этому вопросу, на djangosnippets.org есть несколько реальных примеров такого кода (см. 1 или 2) (и это не так уж и сложно).
AuthenticationBackend
в подклассах должно быть определено только два метода, и их код довольно прост:один должен вернуть объект пользователя для идентификатора пользователя, второй должен выполнить проверку учетных данных и вернуть объект пользователя, если учетные данные действительны.