Python、Django LDAP:检测身份验证失败推理
Python, Django LDAP: detecting Authentication failed reasoning
我正在开发一个将 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."
...
现在最后一步必须是通知用户登录失败的原因。现在失败消息将始终是:"Invalid username or password supplied."
这应该是:
- 错误 username/password
- 不在正确的组中
类似于:
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 身份验证失败的原因?
P.S.: 在 django_auth_ldap 日志中我确实看到了 "DEBUG Authentication failed for username: user does not satisfy AUTH_LDAP_REQUIRE_GROUP"
但是如何在 user_login 视图中知道这一点?
好的,回答我自己的问题。现在我只是从我的配置中删除 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 ...
如果使用 ldap 后端,authenticate() 将调用 populate_user_callback() 函数。所以我自己检查正确的组。
可能有一个 cleaner/better 答案,但目前还有效。
我正在开发一个将 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."
...
现在最后一步必须是通知用户登录失败的原因。现在失败消息将始终是:"Invalid username or password supplied."
这应该是:
- 错误 username/password
- 不在正确的组中
类似于:
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 身份验证失败的原因?
P.S.: 在 django_auth_ldap 日志中我确实看到了 "DEBUG Authentication failed for username: user does not satisfy AUTH_LDAP_REQUIRE_GROUP"
但是如何在 user_login 视图中知道这一点?
好的,回答我自己的问题。现在我只是从我的配置中删除 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 ...
如果使用 ldap 后端,authenticate() 将调用 populate_user_callback() 函数。所以我自己检查正确的组。
可能有一个 cleaner/better 答案,但目前还有效。