Начало
Однажды мне пришлось заняться разработкой Web-приложения для корпоративного использования на Python+Django. И самым первым вопросом, который пришлось решать — это прозрачная авторизация на сайте или Single Sign-On (SSO).
На предприятии широко используется служба каталогов на базе Microsoft Active Directory, и к настоящему моменту практически все корпоративные приложения позволяют использовать windows-авторизацию и не вводить постоянно логины/пароли, поэтому новое приложение просто должно было удовлетворять существующему положению вещей и реализовывать указанную выше возможность для «прозрачной» авторизации пользователей.
Хотя о вопросе реализации SSO для Django написано немало статей, однако для того, чтобы реализовать то, что мне было необходимо, пришлось затратить относительно много времени. Поэтому, чтобы избавить некоторых из вас от возможных долгих поисков информации и ее сборки в работающую схему, предлагаю вам свой мануал, как сделать прозрачную авторизацию в приложении Django с использованием учетных записей Active Directory.
Итак мы имеем:
- Служба каталогов Microsoft Active Directory,
- Имя домена Windows: company.ru
- Имя контроллера домена Windows 2012 Server: DC-1
- IP Address контроллера домена Windows 2012 Server: 192.168.7.110
- Сервер для работы нашего приложения: CentOS7, Apache, Python 3.5.1, Django 1.9.1
- Hostname Linux Server с CentOS7: srv-app
- IP Address Linux Server с CentOS7: 192.168.7.105
- URL Приложения на Django: srv-app.company.ru
Нужно сделать:
- Пользователь, зарегистрированный в Active Directory при открытии любой страницы сайта на srv-app.company.ru должен автоматически, без запроса логина/пароля, быть авторизован Django. При авторизации, в профиль пользователя в Django должна быть перенесена некоторая информация о нем из Active Directory (first_name, last_name, mail; флаги is_active, is_staff, is_supersuser должны быть установлены на основании членства пользователя в соответствующих группах Active Directory).
- Пользователю, не зарегистрированному в Active Directory вход на сайт должен быть запрещен.
Изучив ряд опубликованных статей и описаний стало понятно, что добиться нужного результата можно, выполнив два основных шага:
- Настройка прозрачной аутентификации при доступе к приложению сервером Apache с использованием Kerberos.
- Авторизация в Django c использованием доступа к контроллеру домена по протоколу LDAP для получения необходимой информации об авторизующемся пользователе.
Читать полностью »