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é
相关产品推荐
相关产品推荐

