如何使用django-auth-ldap在Django中获取LDAP服务器的全部用户
解决方法
首先明确核心原因:LDAPBackend.populate_user() 方法仅支持传入单个明确的用户名,从LDAP拉取对应用户并同步到Django本地用户表,不支持通配符批量查询,因此你传入*返回None属于预期行为。
你可以直接复用已经初始化完成的LDAP连接执行查询,匹配你提到的ldap3查询效果的实现代码如下:
import ldap from django_auth_ldap.backend import LDAPBackend, backend from rest_framework.decorators import api_view from rest_framework.response import Response from .serializers import userSerializer @api_view(['GET']) def users(request): # 初始化LDAP连接并绑定 l = ldap.initialize(backend.AUTH_LDAP_SERVER_URI) try: l.simple_bind_s(backend.AUTH_LDAP_BIND_DN, backend.AUTH_LDAP_BIND_PASSWORD) # 执行LDAP查询,对应你提到的ldap3查询逻辑 # 参数说明:查询根DN、查询范围、过滤条件、返回属性列表 ldap_users = l.search_s( 'ou=users,dc=example,dc=com', # 可替换为settings.AUTH_LDAP_USER_SEARCH.base_dn复用已有配置 ldap.SCOPE_SUBTREE, '(objectclass=person)', ['uid', 'cn', 'givenName', 'sn', 'gidNumber'] ) # 处理返回结果:python-ldap返回格式为 (用户DN, {属性名: [属性值字节数组]}) 的元组列表 processed_users = [] ldap_backend = LDAPBackend() for dn, attrs in ldap_users: # 可选:如果需要同步用户到Django本地auth_user表,调用populate_user即可 if 'uid' in attrs: username = attrs['uid'][0].decode('utf-8') user = ldap_backend.populate_user(username) if user: processed_users.append(user) # 无需同步到本地的场景,直接构造字典给序列化器即可 # processed_user = {k: v[0].decode('utf-8') for k, v in attrs.items() if v} # processed_users.append(processed_user) finally: # 保证连接正常释放 l.unbind_s() serializer = userSerializer(processed_users, many=True) return Response(serializer.data)
关键说明
- python-ldap的
search_s是同步查询方法,参数顺序和ldap3的search略有差异,返回的属性值默认是bytes类型,需要手动解码为字符串 - 如果你已经在settings中配置过
AUTH_LDAP_USER_SEARCH,可以直接复用配置里的根DN和过滤条件,不需要硬编码相关参数 - 不需要把LDAP用户同步到Django本地的auth_user表的场景,直接处理返回的attrs字典即可,不需要调用
populate_user
内容的提问来源于stack exchange,提问作者user10695308
相关产品推荐
相关产品推荐

