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

StackOverflow https://stackoverflow.com/questions/152248

  •  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://www.djangosnippets.org/snippets/243/

Проверьте ссылки Оли.По сути, вы видите аутентифицированное имя пользователя, подтвержденное базовой 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 в подклассах должно быть определено только два метода, и их код довольно прост:один должен вернуть объект пользователя для идентификатора пользователя, второй должен выполнить проверку учетных данных и вернуть объект пользователя, если учетные данные действительны.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top