Django Auth с LDAP и локальными учетными записями - PullRequest
2 голосов
/ 24 апреля 2019

У меня сейчас работают Django и LDAP. Однако я хочу ограничить проверку подлинности LDAP только учетными записями в локальной базе данных учетных записей. т.е. если нет локальной учетной записи, запретить доступ / авторизацию ldap происходит.

При просмотре параметров из LDAPSearch Я не могу найти прямой вариант для предоставления этого. Есть идеи как этого добиться?

Ограничение на основе LDAP OU не является опцией, основанной на имеющейся структуре адресов LDAP.

Спасибо

1 Ответ

2 голосов
/ 27 апреля 2019

Как указано в комментариях felix001 , проектная документация описывает флаг AUTH_LDAP_NO_NEW_USERS:

Запретить создание новых пользователей во время аутентификации. Любые пользователи, которых еще нет в базе данных пользователей Django, не смогут войти.

Включение его в настройках включает желаемое поведение:

# settings.py

...

AUTH_LDAP_NO_NEW_USERS = True

Однако эта функция не включена в текущую версию 1.7.0, поэтому необходим обратный порт. Наименее инвазивный импл, о котором я могу думать, это:

# myapp/backend.py

from django_auth_ldap import backend as ldap_backend


# backport for AUTH_LDAP_NO_NEW_USERS setting
ldap_backend.LDAPSettings.defaults.update(NO_NEW_USERS=False)


class MyLDAPBackend(ldap_backend.LDAPBackend):

    def get_or_build_user(self, username, ldap_user):
        user, built = super().get_or_build_user(username, ldap_user)
        if self.settings.NO_NEW_USERS and built:  # user was not found in local db and created instead
            raise ldap_user.AuthenticationFailed(
                f'username {username} does not exist in local DB.'
            )
        return user, built

Активируйте AUTH_LDAP_NO_NEW_USERS в настройках и используйте пользовательский бэкэнд вместо LDAPBackend на данный момент:

# myapp/settings.py

AUTH_LDAP_NO_NEW_USERS = True
AUTHENTICATION_BACKENDS += ('myapp.backend.MyLDAPBackend',)

Сбросить бэкпорт также легко: как только выйдет следующая версия django-auth-ldap, единственное, что вам нужно будет адаптировать - это кортеж AUTHENTICATION_BACKENDS (и, конечно, удалить модуль myapp/backend.py).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...