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.Node的LDAPNode来构建和编辑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.setProtocol、LDAPCommunicator.setBaseDN、LDAPCommunicator.getBaseDN、LDAPSession.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
支持搜索函数中的 attrlist 和 attrsonly。(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
让它工作。(所有贡献者)
版权
版权所有(c)2006-2009:奥地利BlueDynamics Alliance
鸣谢
Robert Niederreiter <rnix@squarewave.at>
Jens Klein <jens@bluedynamics.com>
Georg Bernhard <g.bernhard@akbild.ac.at>
Florian Friesdorf <flo@chaoflow.net>
Johannes Raggam <johannes@bluedynamics.com>
bda.ldap-1.5.2.tar.gz的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | af3c1caedbb9a9f3c05e82654899486d14d8b99f58a35158c6e9e4a9f906d7e5 |
|
MD5 | cef1bde33d047c857bde31c21bcfae68 |
|
BLAKE2b-256 | fd0577bcd280a1748da1455f6abc084b66066b34610a578ce07f81eb5ec16661 |