Python中使用django_auth_ldap插件替代Django自带认证系统登录后台管理时出现"dc=------inc,dc=local is not a member of"错误如何解决?

我想用 ldap 来代替 django 自带的认证系统,来登陆 django 的自带后台,用的这个库 https://github.com/django-auth-ldap/django-auth-ldap 这是我的配置文件

# LDAP
# AUTH_LDAP_START_TLS
AUTH_LDAP_SERVER_URI = "ldap://ldap.------.com"  #配置 ldap 的服务地址

指定使用 ldap 作为认证系统

AUTH_LDAP_BIND_DN = “” AUTH_LDAP_BIND_PASSWORD = “”

ldap 的用户搜索的路径,可以使用 LDAP 的客户端查看用户的搜索路径

我这边使用的 ldapBorwser 查看的 ldap 账号结构和信息

AUTH_LDAP_USER_SEARCH = LDAPSearch(“OU=运维开发,OU=后端开发,OU=技术部,OU=------,DC-------,DC=local”, ldap.SCOPE_SUBTREE, “(uid=%(user)s)”)

print(AUTH_LDAP_USER_SEARCH)

# ldap 用户组的搜索路径

AUTH_LDAP_GROUP_SEARCH = LDAPSearch(“OU=运维开发,OU=后端开发,OU=技术部,OU=-----,DC=-----,DC=local”, ldap.SCOPE_SUBTREE, “(objectClass=groupOfNames)”)

AUTH_LDAP_GROUP_TYPE = PosixGroupType(name_attr=“cn”)

AUTH_LDAP_GROUP_TYPE = “OU=运维开发,OU=后端开发,OU=技术部,OU=------,DC=-------,DC=local”

print(AUTH_LDAP_GROUP_TYPE)

AUTH_LDAP_REQUIRE_GROUP = ‘OU=运维开发,OU=后端开发,OU=技术部,OU=------,DC=-------,DC=local’

ldap 中对于的用户属性同步到 django 用户账号的属性对应列

AUTH_LDAP_USER_ATTR_MAP = { “username”: “uid”, “email”: “mail”, ‘first_name’: “sn”, “last_name”: “givenName” }

AUTH_LDAP_USER_FLAGS_BY_GROUP = { #定义用户可以登录 admin 后台的组是哪个,前面 ldap 中已经创建了这个组,并加入了指定用户

默认创建的 django 用户是不能登录 admin 后台的

"is_staff": "OU=运维开发,OU=后端开发,OU=技术部,OU=------,DC=------,DC=local",
"is_active": "OU=运维开发,OU=后端开发,OU=技术部,OU=-------,DC=------,DC=local",
"is_superuser": "OU=运维开发,OU=后端开发,OU=技术部,OU=--------,DC=------,DC=local"

}

同步 ldap 的用户信息到 django 中

如果第一次登录 django 中没有此用户,ldap 中有,可以自动在 django 中将用户复制过去,并指定权限

AUTH_LDAP_ALWAYS_UPDATE_USER = True

设定 django 第一采用 ldap 权限认证,如果 ldap 中没有用户,再使用 django 中的用户认证

AUTHENTICATION_BACKENDS = ( ‘django_auth_ldap.backend.LDAPBackend’, # ‘django.contrib.auth.backends.ModelBackend’, )

这是 log 记录

我登陆的这个用户在 OU=运维开发,OU=后端开发,OU=技术部,OU=--------,DC=------,DC=local 这个目录中

在作者的 issue 里也只搜到了一个没用的 issue https://github.com/django-auth-ldap/django-auth-ldap/issues/71

我觉得是验证用户组那里出现了问题但是调试了好长时间还是这样

ps: 一些重要信息已经删除或者替换


Python中使用django_auth_ldap插件替代Django自带认证系统登录后台管理时出现"dc=------inc,dc=local is not a member of"错误如何解决?

1 回复

这个错误通常是因为 AUTH_LDAP_USER_SEARCH 配置中的 base_dn 范围设置不当,导致搜索不到用户或组关系。

核心原因
LDAP 搜索时,指定的 base_dn(例如 "dc=example,dc=com")可能不包含用户或组所在的子树,或者搜索过滤器(filterstr)与 LDAP 目录结构不匹配。

解决方案

  1. 检查 AUTH_LDAP_USER_SEARCH 配置
    确保 base_dn 能覆盖用户所在的目录路径。例如,如果用户位于 "ou=users,dc=example,dc=com",则 base_dn 应至少包含该 ou

  2. 调整 AUTH_LDAP_GROUP_SEARCH
    如果启用了 LDAP 组权限,需确保组搜索的 base_dn 正确。

  3. 验证 AUTH_LDAP_USER_FLAGS_BY_GROUP
    检查 is_staffis_superuser 对应的组 DN 是否在搜索范围内。

示例配置修正

import ldap
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType

# 用户搜索:base_dn 应指向包含用户的容器
AUTH_LDAP_USER_SEARCH = LDAPSearch(
    "ou=users,dc=example,dc=local",  # 调整为实际用户所在的 OU
    ldap.SCOPE_SUBTREE,
    "(uid=%(user)s)"
)

# 组搜索:base_dn 应指向包含组的容器
AUTH_LDAP_GROUP_SEARCH = LDAPSearch(
    "ou=groups,dc=example,dc=local",  # 调整为实际组所在的 OU
    ldap.SCOPE_SUBTREE,
    "(objectClass=groupOfNames)"
)

# 用户权限映射:确保组 DN 完整且存在于搜索范围内
AUTH_LDAP_USER_FLAGS_BY_GROUP = {
    "is_staff": "cn=staff,ou=groups,dc=example,dc=local",
    "is_superuser": "cn=admin,ou=groups,dc=example,dc=local",
}

调试建议

  • 使用 ldapsearch 命令行工具验证 DN 是否存在。
  • 在 Django 设置中启用 LOGGING 记录 LDAP 调试信息。

一句话总结:检查并确保所有 DN 路径在 LDAP 目录中存在且搜索范围正确覆盖。

回到顶部