Вопрос по django, ldap, authentication – Проблема с пользовательским бэкэндом аутентификации для Django

9

У меня проблема с пользовательским бэкэндом аутентификации, созданным для Active Directory через аутентификацию LDAP.

Проблема заключается в том, что со страницы входа администратора, после того, как он должным образом аутентифицирует и создает нового пользователя в базе данных (или обновляет его информацию с сервера LDAP), но затем возвращает меня на страницу входа администратора, указывая, что мне не удалось ввести действительный имя пользователя и пароль.

Учитывая, что он аутентифицирует и создает / обновляет пользователя в базе данных django, что я делаю не так?

Код:

import ldap
import re
from django.conf import ad_settings
grps = re.compile(r'CN=(\w+)').findall

def anyof(short_group_list, adu):
    all_groups_of_user = set(g for gs in adu.get('memberOf',()) for g in grps(gs))
    return any(g for g in short_group_list if g in all_groups_of_user)

class ActiveDirectoryBackend(ModelBackend):
    """
    This backend utilizes an ActiveDirectory server via LDAP to authenticate
    users, creating them in Django if they don't already exist.
    """

    def authenticate(self, username=None, password=None):
        con = None
        ldap.set_option(ldap.OPT_REFERRALS, 0)
        try:
            con = ldap.initialize('ldap://%s:%s' % (ad_settings.AD_DNS_NAME,
                  ad_settings.AD_LDAP_PORT))
            con.simple_bind_s(username+"@"+ad_settings.AD_DNS_NAME, password)
            ADUser = con.search_ext_s(ad_settings.AD_SEARCH_DN,
                                      ldap.SCOPE_SUBTREE,
                                      "sAMAccountName=%s" % username,
                                      ad_settings.AD_SEARCH_FIELDS)[0][1]
            con.unbind()
        except ldap.LDAPError:
            return None
        # Does user belong to appropriate AD group?
        if not anyof(ad_settings.PROJECTCODE,ADUser):
            return None

        # Does user already exist in Django?
        try:
            user = User.objects.get(username=username)
        except User.DoesNotExist:
            #create Django user
            user = User(username=username, is_staff = True, is_superuser = False)
        #Update User info from AD
        if ADUser.has_key('givenName'):
            user.first_name = ADUser.get('givenName')[0]
        if ADUser.has_key('sn'):
            user.last_name = ADUser.get('sn')[0]
        if ADUser.has_key('mail'):
            user.email = ADUser.get('mail')[0]

        # Does not store password in Django.
        user.set_unusable_password()
        user.save()
        return user

РЕДАКТИРОВАТЬ: разобрался. Пользователи не могут войти в систему, если они не активны (даже если в документации это не сказано). Следовательно, в данном коде строка, которая создает нового пользователя, должна выглядеть следующим образом:

        user = User(username=username, is_staff = True, is_Active = True, 
                    is_superuser = False)
Рассматривали ли вы использование mod_ldap и RemoteUserMiddleware? davidfischer
Вы должны поместить свое изменение в вопрос и пометить его как ответ, чтобы этот вопрос стал "отвеченным". Adam Nelson
Я искал это, потому что мне нужно писать подобные вещи. Спасибо за публикацию этого :-) gruszczy

Ваш Ответ

1   ответ
3

Разобрался. Пользователи не могут войти в систему, если они не активны (даже если в документации это не сказано). Следовательно, в данном коде строка, которая создает нового пользователя, должна выглядеть следующим образом:

    user = User(username=username, is_staff = True, is_Active = True, 
                is_superuser = False)

Похожие вопросы