Python, Django LDAP: обнаружение ошибки при проверке подлинности

Я работаю над проектом по интеграции аутентификации LDAP в существующее приложение Django. Используя этот сайт и другие, я наконец смог все правильно настроить, используя бэкэнд django_auth_ldap. В том числе:

AUTH_LDAP_REQUIRE_GROUP = "CN=myGroup,CN=groups [...] " Таким образом, только пользователи в группе "myGroup" могут войти в систему.

Теперь все настроено правильно в settings.py и в представлении user_login есть только:

...
user = authenticate(username=username, password=password)
if user:
    if user.is_active:
        login(request, user)
        return redirect('index')
    else:
        message = "Your account is disabled."
else:
    message = "Invalid username or password supplied."
...

Теперь последним шагом должно быть уведомление пользователя о том, почему его логин не удался. прямо сейчас сообщение об ошибке всегда будет выглядеть так: "Указано неверное имя пользователя или пароль". Это должно быть либо:
- Неправильное имя пользователя / пароль
- Не в нужной группе

Что-то вроде:

if user:
...
else: 
    if (LDAP auth failed reason == user does not satisfy AUTH_LDAP_REQUIRE_GROUP):
       message = "You are not in the right user group."
    else:
       message = "Invalid username or password supplied."
...


Как я могу узнать, в моем представлении user_login причина неудачной аутентификации LDAP?


PS: в журнале django_auth_ldap я вижу "Ошибка аутентификации DEBUG для имени пользователя: пользователь не удовлетворяет AUTH_LDAP_REQUIRE_GROUP"
Но как узнать это в представлении user_login?

1 ответ

Решение

Хорошо, чтобы ответить на мой собственный вопрос. Сейчас я только что удалил AUTH_LDAP_REQUIRE_GROUP = "CN=myGroup,CN=groups [...] " из моего конфига, и добавил следующее в views.py:

from django_auth_ldap.backend import populate_user
def populate_user_callback(sender, **kwargs):
    global isLdapUser;
    global isInRightGroup;

    isLdapUser = True;
    if "myGroup" in kwargs["ldap_user"].group_names:
        isInRightGroup = True;

populate_user.connect(populate_user_callback)   

И в user_login:

    isLdapUser = False;
    isInRightGroup = False;

    user = authenticate(username=username, password=password)

    if (isLdapUser and not isInRightGroup):
        user = None
        message = "User is not in the right AD group."
        ...
        return ...

authenticate () вызовет функцию populate_user_callback(), если используется бэкэнд ldap. Так что я просто проверяю правильную группу самостоятельно.


Вероятно, есть более чистый / лучший ответ для этого, но пока это работает.

Другие вопросы по тегам