В статье Django аутентификация через NGINX kerberos (Active Directory) я описал как использовать прозрачную (sso) аутентификацию.
Django RemoteUserBackend работает так как надо, но мне понадобилось для создаваемого пользователя добавлять из Active Directory дополнительную информацию, а именно ФИО и email. Схема получилась такая:
1) Пользователь первый раз заходит на сайт example.com
2) RemoteUserBackend создает учетную запись пользователя (user.username) в Django
3) ... и дополнительно загружает информацию с использованием класса ADRemoteUserBackend
Ниже привожу код LDAPRemoteUserBackend.py с комментариями, что и куда добавлять.
Django RemoteUserBackend работает так как надо, но мне понадобилось для создаваемого пользователя добавлять из Active Directory дополнительную информацию, а именно ФИО и email. Схема получилась такая:
1) Пользователь первый раз заходит на сайт example.com
2) RemoteUserBackend создает учетную запись пользователя (user.username) в Django
3) ... и дополнительно загружает информацию с использованием класса ADRemoteUserBackend
Ниже привожу код LDAPRemoteUserBackend.py с комментариями, что и куда добавлять.
"""
ADRemoteUserBackend добавляет фамилию, имя и email из Active Directory. Используется
как расширение RemoteUserBackend.
У меня данный LDAPRemoteUserBackend.py находится в папке back, там же где и settings.py
Для аутентификации надо убрать RemoteUserBackend и добавить в settings.py:
AUTHENTICATION_BACKENDS = [
#'django.contrib.auth.backends.RemoteUserBackend',
'back.LDAPRemoteUserBackend.ADRemoteUserBackend',
'django.contrib.auth.backends.ModelBackend',
]
"""
from django.contrib.auth.backends import RemoteUserBackend
from django.conf import settings as s
from ldap3 import Server, Connection, SIMPLE, SYNC, ASYNC, SUBTREE, ALL
"""
Если созданному пользователю надо добавить права superuser (например, пользователь admin), то
python manage.py shell
from django.contrib.auth.models import User
user = User.objects.get(username=admin)
user.is_staff = True
user.is_superuser = True
user.save()
"""
# Можно прописать следующие Константы в settings.py, а можно и здесь (чтобы не засорять settings.py)
# DNS имя сервера Active Directory
s.AD_SERVER = "srv.example.com"
# Пользователь (логин) в Active Directory - нужно указать логин в AD в формате 'EXAMPLE\aduser' или 'aduser@example.com'
s.AD_USER = 'EXAMPLE\userad'
s.AD_PASSWORD = 'FADSfjkb,.^%'
s.AD_SEARCH_TREE = 'dc=exampe,dc=com'
class ADRemoteUserBackend(RemoteUserBackend):
def clean_username(self,username):
clean_username=username.split('@')[0]
return clean_username
def configure_user(self,user):
#Если нужно пускать пользователей в админку, то раскоментировать следующую строку
#user.is_staff=True
#connect to ldap server
server = Server(s.AD_SERVER)
conn = Connection(server, user=s.AD_USER, password=s.AD_PASSWORD)
conn.bind()
AD_FILTER = '(&(objectCategory=Person)(sAMAccountName='+user.username+'))'
# get user Common-Name, email, first name, last name, отчество, full Name - attributes ['cn', 'mail', 'givenName', 'sn', 'initials', 'displayName']
conn.search(s.AD_SEARCH_TREE, AD_FILTER, SUBTREE, attributes =['cn', 'mail', 'givenName', 'sn', 'initials', 'displayName'])
for entry in conn.entries:
if entry.mail:
user.email = entry.mail
try:
displayName = entry.displayName.value
except:
displayName = entry.cn.value
if displayName:
displayName = displayName.split(" ")
else:
displayName = ""
if (displayName[1] and displayName[2]):
user.first_name = displayName[1] + " " + displayName[2]
elif (displayName[1]):
user.first_name = displayName[1]
if displayName[0]:
user.last_name = displayName[0]
#close LDAP Connection
conn.unbind()
user.save()
Комментариев нет:
Отправить комментарий