无法通过Python ldap3模块连接在线LDAP测试服务器求助
解决LDAP连接与搜索失败的问题
我之前也用过这个测试LDAP服务器,你的代码里有几个关键问题导致搜索返回False,咱们一步步来修正:
1. 绑定用户需要完整的DN,而非单纯用户名
这个测试服务器的用户DN格式是 uid={username},ou=mathematicians,dc=example,dc=com,你直接用riemann作为user参数绑定,LDAP服务器无法识别这个身份。所以绑定的user应该改成完整的DN:
user = 'uid=riemann,ou=mathematicians,dc=example,dc=com'
2. 修正搜索过滤器的错误
- 这个测试服务器里的用户对象类不是
user(那是Active Directory的专属对象类),而是inetOrgPerson或者person; - 用户标识属性是
uid,不是userPrincipalName; - 直接字符串拼接过滤器容易出现语法错误,建议用f-string来构建更安全。
修正后的搜索过滤器可以写成:
search_filter = f'(&(objectClass=inetOrgPerson)(uid=riemann))'
3. 正确处理search方法的返回值与结果
ldap3.Connection.search()返回的布尔值只是表示搜索是否成功执行,实际的搜索结果存在connection.entries里,你直接打印返回的布尔值自然会得到False(因为之前的绑定和过滤器错误导致搜索失败)。
完整修正后的代码
import ldap3 # 配置用户信息 user_uid = 'riemann' user_dn = f'uid={user_uid},ou=mathematicians,dc=example,dc=com' password = 'password' # 初始化服务器和连接 server = ldap3.Server('ldap.forumsys.com', port=389) connection = ldap3.Connection(server, user=user_dn, password=password) # 先检查绑定是否成功 bind_success = connection.bind() if not bind_success: print(f"绑定失败:{connection.result}") else: print("绑定成功!") # 执行搜索 search_success = connection.search( search_base='ou=mathematicians,dc=example,dc=com', search_filter=f'(&(objectClass=inetOrgPerson)(uid={user_uid}))', attributes='*' ) if search_success: # 打印搜索结果 print("搜索结果:") for entry in connection.entries: print(entry) else: print(f"搜索失败:{connection.result}")
额外提示
- 你可以先通过匿名绑定测试服务器是否可达:
connection = ldap3.Connection(server, user='', password=''),绑定成功后可以先查询基础信息确认目录结构; - 用
ldap3的ObjectDef和Filter类构建搜索条件,能避免很多语法错误,比如:from ldap3 import ObjectDef, Filter person_obj = ObjectDef('inetOrgPerson', server) search_filter = Filter.eq(person_obj.uid, user_uid)
内容的提问来源于stack exchange,提问作者GopiKrishna
相关产品推荐
相关产品推荐

