Python-ldap ldap.initialize 拒绝 ldapurl 认为有效的 URL

标签 python ldap python-ldap

我想使用运行时给出的 ldap url 打开到 ldap 目录的连接。例如:

ldap://192.168.2.151/dc=directory,dc=example,dc=com

据我所知,这是有效的。 Python-ldap url 解析器 ldapurl.LDAPUrl 接受它。

url = 'ldap://192.168.2.151/dc=directory,dc=example,dc=com'
parsed_url = ldapurl.LDAPUrl(url)
parsed_url.dn
'dc=directory,dc=example,dc=com'

但是如果我使用它来初始化 LDAPObject,我会收到 ldap.LDAPError 异常

ldap.initialize(url)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/ldap/functions.py", line 91, in initialize
    return LDAPObject(uri,trace_level,trace_file,trace_stack_limit)
  File "/usr/lib/python2.7/dist-packages/ldap/ldapobject.py", line 70, in __init__
    self._l = ldap.functions._ldap_function_call(ldap._ldap_module_lock,_ldap.initialize,uri)
File "/usr/lib/python2.7/dist-packages/ldap/functions.py", line 63, in _ldap_function_call
  result = func(*args,**kwargs)
ldap.LDAPError: (0, 'Error')

我发现如果我手动编码网址的 dn 部分,它就可以工作:

url = 'ldap://192.168.2.151/dc=directory%2cdc=example%2cdc=com'

#url still valid
parsed_url = ldapurl.LDAPUrl(url)
parsed_url.dn
'dc=directory,dc=example,dc=com'

#and will return a valid connection
ldap.initialize(url)
<ldap.ldapobject.SimpleLDAPObject instance at 0x1400098>

如何确保 ldap.initialize 中的稳健 url 处理,而无需自己对 url 的部分进行编码? (我担心,无论如何,它不会那么强大)。

最佳答案

您可以以编程方式对 URL 的最后部分进行编码:

from urllib import quote       # works in Python 2.x
from urllib.parse import quote # works in Python 3.x

url = 'ldap://192.168.2.151/dc=directory,dc=paralint,dc=com'
idx = url.rindex('/') + 1
url[:idx] + quote(url[idx:], '=')
=> 'ldap://192.168.2.151/dc=directory%2Cdc=paralint%2Cdc=com'

关于Python-ldap ldap.initialize 拒绝 ldapurl 认为有效的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17204133/

相关文章:

python - 循环数据框列python

python - Google Cloud 函数 Python Flask 模板文件夹

python - 如何使用 django-python3-ldap 从 Active Directory 组在 Django 模型中创建组和权限?

python-ldap -- 在 Active Directory 中创建用户 -- 问题 2003 (BAD_ATT_SYNTAX) cn 和 DN

Python LDAP 将属性写入 Active Directory

python - 递归斐波那契 yield

java - Spring Boot 安全调用 LDAP

java - 如何使用 JNDI 将 OU 添加到 LDAP

Python LDAP - 将用户移动到不同的 OU

python - 在Python中获取矩阵/列表列表中的所有对角线