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

Python LDAP 如何递归查询用户所属的全部用户组

Python LDAP 递归查询用户全量所属组实现方法

核心逻辑是先查询用户直接关联的组,再逐层向上查询每个组的父级组,同时去重避免循环嵌套导致的死循环。

前置依赖

需要先安装python-ldap库:

pip install python-ldap

实现代码

import ldap

# 按需修改为你的LDAP配置
LDAP_CONFIG = {
    "server": "ldap://你的LDAP服务地址",
    "bind_dn": "绑定账号DN",
    "bind_pwd": "绑定账号密码",
    "base_dn": "LDAP根目录DN",
    "username_field": "sAMAccountName" # OpenLDAP环境改为uid
}

def get_user_all_groups(username: str) -> list:
    # 初始化LDAP连接
    conn = ldap.initialize(LDAP_CONFIG["server"])
    conn.simple_bind_s(LDAP_CONFIG["bind_dn"], LDAP_CONFIG["bind_pwd"])
    
    group_names = set()
    processed_dns = set()

    # 递归查询父组
    def find_parent_groups(entry_dn: str):
        if entry_dn in processed_dns:
            return
        processed_dns.add(entry_dn)
        # 查询所有包含当前DN作为成员的组
        search_filter = f"(member={entry_dn})"
        results = conn.search_s(
            LDAP_CONFIG["base_dn"],
            ldap.SCOPE_SUBTREE,
            search_filter,
            attrlist=["cn"]
        )
        for group_dn, group_attrs in results:
            group_name = group_attrs["cn"][0].decode("utf-8")
            group_names.add(group_name)
            # 继续查询当前组的父组
            find_parent_groups(group_dn)

    # 先查询目标用户的DN
    user_filter = f"({LDAP_CONFIG['username_field']}={username})"
    user_result = conn.search_s(
        LDAP_CONFIG["base_dn"],
        ldap.SCOPE_SUBTREE,
        user_filter,
        attrlist=["dn"]
    )
    if not user_result:
        conn.unbind_s()
        return []
    user_dn = user_result[0][0]
    find_parent_groups(user_dn)
    
    conn.unbind_s()
    return list(group_names)

# 测试调用,返回结果示例:["Zurich", "Switzerland"]
print(get_user_all_groups("目标用户名"))

注意事项

  • 代码默认适配Active Directory环境,OpenLDAP环境仅需修改配置中的username_field为uid即可
  • 采用set存储已查询的DN和组名,自动规避组循环嵌套的死循环问题
  • 若LDAP服务数据量较大,可添加SimplePagedResultsControl开启分页查询避免查询超限

内容的提问来源于stack exchange,提问作者Thorben Croisé

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:09:02