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. Так что я просто проверяю правильную группу самостоятельно.
Вероятно, есть более чистый / лучший ответ для этого, но пока это работает.