跳转到主要内容

LDAP便捷库

项目描述

LDAP便捷库

此软件包提供用于LDAP通信的对象。

LDAP会话

您可以与LDAPSession对象一起工作。

>>> from bda.ldap import ONELEVEL
>>> from bda.ldap import LDAPSession
>>> from bda.ldap import LDAPProps

>>> props = LDAPProps('localhost',
...                   389,
...                   'cn=user,dc=example,dc=com',
...                   'secret'
...                   cache=True,
...                   timeout=12345)
>>> session = LDAPSession(props)
>>> res = session.search('(uid=*)', ONELEVEL)

LDAP节点

您可以使用基于zodict.NodeLDAPNode来构建和编辑LDAP数据树。

根节点需要基础DN和服务器属性进行初始化。

>>> from bda.ldap import LDAPNode
>>> root = LDAPNode('dc=my-domain,dc=com', props=props)
>>> root.keys()
['ou=customers']

您可以创建和添加新的LDAP条目。

>>> person = LDAPNode()
>>> person.attributes['objectClass'] = ['top', 'person']
>>> person.attributes['sn'] = 'Mustermann'
>>> person.attributes['cn'] = 'Max'
>>> person.attributes['description'] = 'Description'
>>> customers['cn=max'] = person
>>> customers.keys()
['cn=max']

__call__上,将树的修改写入目录。

>>> customers()

条目属性的修改。

>>> person.attributes['description'] = 'Another description'
>>> person()

>>> del person.attributes['description']
>>> person()

条目的删除。

>>> del customers['cn=max']
>>> customers()

更多详情请参阅相应的源代码和测试文件。

字符编码

LDAP (至少v3,RFC 2251) 使用utf8字符串编码。从1.5.1版本开始,LDAPSession和LDAPNode会为您将这些转换为Unicode。如果您从LDAPSession或LDAPNode接收到的不是Unicode,请将其视为一个错误。LDAPConnector和LDAPCommunicator以下的所有内容都提供真实的LDAP体验。 - 我们是否也应该更改这一点?

将传递给节点或会话的 Unicode 字符串自动编码为 UTF-8 以用于 LDAP。如果您提供普通字符串,则将它们解码为 UTF-8 并重新编码为 UTF-8,以确保它们是 UTF-8 或兼容的,例如 ASCII。

如果 UTF-8 解码失败,则假定值是二进制格式,并将其保留为字符串(见 TODO)。

如果您有一个不使用 UTF-8 的 LDAP 服务器,请对 bda.ldap.strcodec.LDAP_CHARACTER_ENCODING 进行 monkey-patch。

如果您对所有这些编码/解码感到困惑:Python 知道它以何种编码存储 Unicode,然而,它无法知道普通字符串的编码。因此,您应该仅使用 Unicode。为了获得一个 Unicode 字符串,需要根据给定的编码方案(例如 UTF-8)解码字符串。编码 Unicode 会在特定编码(例如 UTF-8)下产生字符串。

缓存支持

bda.ldap 使用轻量级的 bda.cache 缓存 LDAP 查询。您需要在您的应用程序中提供一个实用程序以使缓存工作。如果不这样做,bda.ldap 将回退到使用 NullCache,该缓存不会缓存任何内容。

为了提供一个基于 Memcached 的缓存,请安装 memcached 服务器,配置并启动它。我假设它已经在本地主机端口 11211 上启动(这是一个常见的默认设置)。然后您需要提供一个充当工厂的实用程序。

>>> from bda.ldap.cache import MemcachedProviderFactory
>>> providerfactory = MemcachedProviderFactory()
>>> from zope.component import provideUtility
>>> provideUtility(providerfactory)

在您有多个运行的 memcached 服务器或它在另一台机器上运行的情况下,您需要以不同的方式初始化工厂。

>>> providerfactory = MemcachedProviderFactory(servers=[10.0.0.10:22122,
...                                                     10.0.0.11:22322])
>>> provideUtility(providerfactory)

依赖项

  • python-ldap

  • zodict

  • bda.cache

关于 python-ldap 的说明

尽管 python-ldap 可通过 pypi 获取,但由于不同平台上的不同编译问题,我们将其排除在 install_requires 之外。

因此,您必须确保以任何方式在您的系统上安装了 pyhon-ldap

TODO

  • TLS/SSL 支持。在 LDAPConnector 中可能有用:python-ldap 的类 SmartLDAPObject(ReconnectLDAPObject) - 主要的 __init__() 方法执行一些更智能的事情,例如协商 LDAP 协议版本并调用 LDAPObject.start_tls_s()。

  • 在 LDAPSession 中改进重试逻辑可能有用,python-ldap 的类 ReconnectLDAPObject(SimpleLDAPObject) - 在服务器失败(ldap.SERVER_DOWN)的情况下,所有同步操作方法(search_s() 等)的实现都会自动重新连接和重新绑定,并重试相同的操作。

  • 扩展 LDAPSession 对象以处理备用服务器

  • 将数据发送到 ldap 的编码/解码改变了字典条目的顺序,这可能是由于字典实现引起的。调查这种影响。到目前为止,我有一种印象,即如果给 ldap(至少 openldap)一个 ldif 文件,它将保留顺序。如果是这样,python-ldap 应该使用 odicts 而不是 dicts。

  • 对仅键的 LDAPNode.sortonkeys() 执行静默排序

  • 二进制属性:1. 引入 Binary:node['cn=foo'].attributes['image'] = Binary(stream),2. 解析 ldap 架构以识别二进制属性

更改

1.5.2

  • 假设无法解码的字符串为二进制,并将其保留原样(chaoflow,2010-07-19)

  • session.search,默认过滤器 '(objectClass=*)' 和范围 BASE,即仅调用 search 返回 basedn 条目。另外,还可以调用 session.search(scope=ONELEVEL) 来获取基于 dn 下方的一个级别的所有条目。(chaoflow,2010-07-19)

1.5.1

  • 字符编码:LDAPSession 和 LDAPNode 只返回 Unicode,并强制所有接收到的字符串使用 UTF-8 或兼容编码,请参阅 Character Encoding。 (chaoflow,2010-07-17)

  • 引入了 strcodec 模块以进行 unicode->str->unicode 转换(chaoflow,2010-07-17)

  • 添加 LDAPNode.get 以使用 odict 的 LDAPNode.__getitem__ 而不是(chaoflow,2010-07-16)

  • 更多测试,explode_dn 用于 dn 处理(含空格和转义逗号)(chaoflow,2010-07-16)

  • 忽略 dn=None 的结果。ActiveDirectory 产生它们(chaoflow,2010-07-15)

  • session.search 的默认过滤器,如果传递 ''、u'' 或 None 作为过滤器(chaoflow,2010-07-15)

  • attrlist 和 attrsonly 的测试(chaoflow,2010-07-15)

  • 适配最新版本的 zodict。(rnix,2010-07-15)

  • 添加了对节点排序的支持。注意:这将唤醒 Node 的所有子节点。(jensens,2010-04-16)

  • 添加了对“items() to Node”的支持。(jensens,2010-04-16)

  • zope2.9 的 BBB 兼容性(rnix,jensens,2010-02-17)

  • 如果添加了节点但没有添加子节点,则 __iter__ 失败。现在已修复。(jensens,2010-01-19)

  • 如果添加了节点,则无法加载其属性。现在考虑这一点。(jensens,2010-01-17)

1.5.0

  • 使 MemcachedProviderFactory 可配置。默认行为与先前版本相同。新功能:我们可以向构造函数传递 server= 关键字参数,期望是一个服务器列表,每个服务器形式为 server:port。(jensens,2009-12-30)

  • 默认不提供任何缓存提供程序工厂。添加了一个 nullCacheProviderFactory,它提供非缓存行为。如果未注册任何实用程序,则将其用作回退。(jensens,2009-12-30)

  • LDAPNode 添加读取属性 ldap_session。这样,在应用程序中(例如,用于搜索)获取 LDAPNode 的会话就很简单了。在使用会话直接操作 LDAP 时请谨慎;使 LDAPNode 实例无效的责任在于应用程序开发者。(jensens,2009-12-30)

1.4.0

  • 添加 LDAPProps 对象。它指向 LDAPServerProperties 类。后者将在 1.5 版本中重命名为 LDAPProps。类名太长。(rnix,2009-12-23)

  • 添加 LDAPSession.unbind 函数。(rnix,2009-12-23)

  • LDAPSession 添加一些测试。(rnix,2009-12-23)

  • LDAPSession.__init__. 中删除已弃用的 cache 关键字参数。由于 LDAPServerProperties,缓存超时和标志是启用缓存的方式。(rnix,2009-12-23)

  • 弃用 LDAPConnector.__init__ 的签名。(rnix,2009-12-23)

  • 弃用 LDAPConnector.setProtocolLDAPCommunicator.setBaseDNLDAPCommunicator.getBaseDNLDAPSession.setBaseDN。(rnix,2009-12-23)

  • 重构整个 LDAPNode 以使用 zodict.LifecycleNode。清理 LDAPNode 代码。(jensens、rnix,2009-12-22)

  • 改进了测试中 ldap 服务器的停止机制。(jensens,2009-12-16)

  • 删除弃用警告:使用 hashlib 进行 md5,并回退到 python2.4 中的 md5。(jensens,2009-12-16)

1.3.2

  • 处理缓存超时,目前作为 workaround。(rnix,2009-09-02)

1.3.1

  • LDAPProperties 添加 cache 属性。(rnix,2009-05-08)

  • 修改会话以适应此新的缓存属性。(rnix,2009-05-07)

  • 添加 queryNode 函数。(rnix,2009-05-07)

  • 向节点添加 get 函数,由于 LDAP 读取逻辑而失败。(rnix,2009-05-07)

1.3

  • 支持搜索函数中的 attrlistattrsonly。(rnix,2009-04-16)

  • 添加 LDAPEntry 对象。(rnix,2009-04-16)

  • 将搜索基础添加到缓存键中。(rnix,2009-04-16)

1.2.3

  • LDAPSession 中的 bug 修复。将 force_reload 传递给相关的执行函数。(rnix,2009-02-11)

1.2.2

  • 添加 buildout 以进行独立测试。(rnix、jensens - 2009-02-11)

  • 添加测试。(rnix、jensens - 2009-02-11)

  • 通过包 __init__ 提供相关对象。(rnix、jensens - 2009-02-11)

1.2.1

  • LDAPSession 中提供与 LDAPCommunicator 相同的 search() 签名。(rnix - 2009-02-10)

  • 仅在调试时记录。(rnix - 2009-02-10)

<= 1.2

  • 让它工作。(所有贡献者)

鸣谢

由以下机构支持