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».