You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

django-python3-ldap仅特定AD组用户认证调试求助

问题

已实现django-python3-ldap的基础认证功能,但需要限制仅允许MSBI组织单元下的“BI - Admin”AD组用户登录。当前可认证所有用户的代码如下:

Settings.py

AUTHENTICATION_BACKENDS = ["django_python3_ldap.auth.LDAPBackend"]
#AUTH_LDAP_SERVER_URI = "LDAP://SERVERNAME"
LDAP_AUTH_URL = ["LDAP://SERVERNAME:389"]
LDAP_AUTH_USE_TLS = False
import ssl
LDAP_AUTH_TLS_VERSION = ssl.PROTOCOL_TLSv1_2
LDAP_AUTH_SEARCH_BASE = "cn=users,dc=DOMAIN,dc=org"
LDAP_AUTH_OBJECT_CLASS = "user"
LDAP_AUTH_USER_FIELDS = {
"username": "sAMAccountName",
"first_name": "givenName",
"last_name": "sn",
"email": "mail",
}
LDAP_AUTH_USER_LOOKUP_FIELDS = ("username",)

LDAP_AUTH_CLEAN_USER_DATA = "django_python3_ldap.utils.clean_user_data"

LDAP_AUTH_SYNC_USER_RELATIONS = "django_python3_ldap.utils.sync_user_relations"

from apprum.ldap_filters import custom_format_search_filters

LDAP_AUTH_FORMAT_SEARCH_FILTERS = "apprum.ldap_filters.custom_format_search_filters"

LDAP_AUTH_FORMAT_USERNAME = "django_python3_ldap.utils.format_username_active_directory_principal"

LDAP_AUTH_ACTIVE_DIRECTORY_DOMAIN = "domain.org"

ldap_filters.py

from django_python3_ldap.utils import format_search_filters

def custom_format_search_filters(ldap_fields):
    #ldap_fields["memberOf"] = "BI - Admin"
    search_filters = format_search_filters(ldap_fields)
    # Advanced: apply custom LDAP filter logic.
    #search_filters.append("(|(memberOf=BI - Team))")
    #search_filters.append("(&(memberOf=cn=BI - Admin,OU=MSBI,DC=domain,dc=org))")
    # All done!
    print(search_filters)
    return search_filters

Active Directory结构

Domain.org --> Groups --> MSBI --> BI - Admin
Domain.org --> Users --> Adam.Wally

测试用户Adam.Wally属于“BI - Admin”组,理论上应能通过认证,但取消注释ldap_fields["memberOf"] = "BI - Admin"后,终端输出如下:

LDAP connect succeeded
['(sAMAccountName=adam.wally)', '(objectClass=user)', '(memberOf=BI - Admin)']
LDAP user lookup failed

请问是否遗漏了什么明显的配置?


解决方案

问题核心是**memberOf过滤条件格式错误**,Active Directory中memberOf属性存储的是组的完整DN(区分名),而非简单组名,以下是具体修正步骤:

  1. 使用组的完整DN作为过滤条件
    根据你的AD结构,“BI - Admin”组的完整DN应为cn=BI - Admin,OU=MSBI,OU=Groups,dc=domain,dc=org(需与实际AD的OU层级完全匹配)。修改ldap_filters.py如下:

    from django_python3_ldap.utils import format_search_filters
    
    def custom_format_search_filters(ldap_fields):
        # 替换为组的完整DN
        ldap_fields["memberOf"] = "cn=BI - Admin,OU=MSBI,OU=Groups,dc=domain,dc=org"
        search_filters = format_search_filters(ldap_fields)
        print(search_filters)
        return search_filters
    
  2. 处理嵌套组场景(可选)
    如果用户可能通过嵌套组间接属于“BI - Admin”,需使用AD的递归查询扩展过滤器memberOf:1.2.840.113556.1.4.1941:,修改代码为:

    from django_python3_ldap.utils import format_search_filters
    
    def custom_format_search_filters(ldap_fields):
        search_filters = format_search_filters(ldap_fields)
        # 添加递归组查询规则
        search_filters.append("(memberOf:1.2.840.113556.1.4.1941:=cn=BI - Admin,OU=MSBI,OU=Groups,dc=domain,dc=org)")
        return search_filters
    
  3. 检查LDAP绑定权限
    确保LDAP绑定账号(若配置LDAP_AUTH_BIND_DN和LDAP_AUTH_BIND_PASSWORD)拥有读取用户memberOf属性的权限,部分AD环境默认匿名用户无法访问该属性。

  4. 验证DN正确性
    可通过ADSI Edit或ldapsearch工具确认“BI - Admin”组的完整DN,避免拼写错误或OU层级错误。

内容的提问来源于stack exchange,提问作者SiSPX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:55:27