How to authenticate against Django’s user database from Apache

Поскольку синхронизация нескольких баз данных аутентификации является распространенной проблемой при работе с Apache, вы можете настроить Apache на аутентификацию непосредственно по authentication system Django. Для этого требуется Apache версии >= 2.2 и mod_wsgi >= 2.0. Например, вы можете:

  • Подача статических/медийных файлов непосредственно из Apache только аутентифицированным пользователям.
  • Аутентификация доступа к репозиторию Subversion по пользователям Django с определенными правами.
  • Разрешить определенным пользователям подключаться к WebDAV ресурсу, созданному с помощью mod_dav.

Примечание

Если вы установили custom user model и хотите использовать этот обработчик авторизации по умолчанию, он должен поддерживать атрибут is_active. Если вы хотите использовать авторизацию на основе групп, ваш пользовательский пользователь должен иметь отношение с именем „groups“, ссылающееся на связанный объект, имеющий поле „name“. Вы также можете указать свой собственный обработчик mod_wsgi auth, если ваш пользовательский не может соответствовать этим требованиям.

Аутентификация с помощью mod_wsgi

Примечание

Использование WSGIApplicationGroup %{GLOBAL} в приведенных ниже конфигурациях предполагает, что на вашем экземпляре Apache запущено только одно приложение Django. Если у вас запущено более одного приложения Django, пожалуйста, обратитесь к разделу Defining Application Groups документации mod_wsgi для получения дополнительной информации об этой настройке.

Make sure that mod_wsgi is installed and activated and that you have followed the steps to set up Apache with mod_wsgi.

Затем отредактируйте конфигурацию Apache и добавьте местоположение, которое будет доступно только аутентифицированным пользователям:

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonPath /path/to/mysite.com

WSGIProcessGroup %{GLOBAL}
WSGIApplicationGroup %{GLOBAL}

<Location "/secret">
    AuthType Basic
    AuthName "Top Secret"
    Require valid-user
    AuthBasicProvider wsgi
    WSGIAuthUserScript /path/to/mysite.com/mysite/wsgi.py
</Location>

Директива WSGIAuthUserScript указывает mod_wsgi на выполнение функции check_password в указанном wsgi скрипте, передавая имя пользователя и пароль, которые он получает от подсказки. В этом примере директива WSGIAuthUserScript совпадает с директивой WSGIScriptAlias, определяющей ваше приложение that is created by django-admin startproject.

Использование Apache 2.2 с аутентификацией

Убедитесь, что mod_auth_basic и mod_authz_user загружены.

Они могут быть статически скомпилированы в Apache, или вам может понадобиться использовать LoadModule для динамической загрузки их в ваш httpd.conf:

LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authz_user_module modules/mod_authz_user.so

Наконец, отредактируйте ваш сценарий WSGI mysite.wsgi, чтобы связать аутентификацию Apache с механизмами аутентификации вашего сайта, импортировав функцию check_password:

import os

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

from django.contrib.auth.handlers.modwsgi import check_password

from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()

Запросы, начинающиеся с /secret/, теперь будут требовать аутентификации пользователя.

В mod_wsgi access control mechanisms documentation приведены дополнительные подробности и информация об альтернативных методах аутентификации.

Авторизация с помощью mod_wsgi и групп Django

mod_wsgi также предоставляет функциональность для ограничения определенного местоположения для членов группы.

В этом случае конфигурация Apache должна выглядеть следующим образом:

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py

WSGIProcessGroup %{GLOBAL}
WSGIApplicationGroup %{GLOBAL}

<Location "/secret">
    AuthType Basic
    AuthName "Top Secret"
    AuthBasicProvider wsgi
    WSGIAuthUserScript /path/to/mysite.com/mysite/wsgi.py
    WSGIAuthGroupScript /path/to/mysite.com/mysite/wsgi.py
    Require group secret-agents
    Require valid-user
</Location>

Для поддержки директивы WSGIAuthGroupScript тот же WSGI-скрипт mysite.wsgi должен также импортировать функцию groups_for_user, которая возвращает список групп, к которым принадлежит данный пользователь.

from django.contrib.auth.handlers.modwsgi import check_password, groups_for_user

Запросы /secret/ теперь также требуют, чтобы пользователь был членом группы «secret-agents».

Вернуться на верх