3

幸运的是,此代码仅用于测试,并且足够短,只需在此处完整复制/粘贴即可。基本上,我需要绑定到一个 dn 才能获得我的搜索的具体细节。否则,如果不绑定,它会匿名绑定,然后我只能获取准系统信息。除非我在绑定后明确运行 whoami_s() ,否则我似乎无法成功绑定。

不起作用的代码(匿名绑定):

l = ldap.initialize("ldap://myldapserver")
l.simple_bind("cn=test,ou=profile,dc=site,dc=com", "abc123")
basedn = "ou=people,dc=site,dc=com"
filter = "uid=bob"
results = l.search_st(basedn, ldap.SCOPE_SUBTREE, filter)
for entry in results:
   print entry

有效的代码(成功绑定并提供所有可能的细节):

l = ldap.initialize("ldap://myldapserver")
l.simple_bind("cn=test,ou=profile,dc=site,dc=com", "abc123")
l.whoami_s()  ### <---- This is the only difference ###
basedn = "ou=people,dc=site,dc=com"
filter = "uid=bob"
results = l.search_st(basedn, ldap.SCOPE_SUBTREE, filter)
for entry in results:
   print entry

我发现有关 LDAP 模块的文档非常缺乏(例如,我找不到任何详细说明 bind、bind_s、simple_bind 和 simple_bind_s 之间的确切区别的内容,但这是另一天的问题。)。我找不到任何明确表示您需要使用 whoami_s() 或任何东西完成绑定的内容。我应该接受它,还是应该担心?

Python: 2.6.9
LDAP module: 2.4.13
4

2 回答 2

3

只是通过反复试验才弄清楚这一点。首先,经过更多搜索,我找到了一个网站,明确说明了 bind、bind_s、simple_bind 和 simple_bind_s 之间的区别:http: //www.packtpub.com/article/installing-and-configuring-the-python-ldap -library-and-binding-to-an-ldap-directory

最后没有“s”的方法是异步的——代码继续判断操作是否完成。以“s”结尾的方法是同步的——代码停止并等待操作完成。

所以我在这里面临的是某种种族条件。我用“time.sleep(1)”代替“whoami_s()”,就解决了问题。这使我意识到我需要从“simple_bind”更改为“simple_bind_s”。在正确绑定之前,我访问 LDAP 查询代码的速度太快了,所以它是匿名执行的。

于 2013-11-14T14:36:44.843 回答
0

这很奇怪。在最简单的情况下,客户必须:

  • 连接到服务器。
  • 如果连接成功,通过BIND请求(有simple和SASL两种)根据需要改变连接的授权状态。
  • 如果 BIND 成功,则传输其他 LDAP 请求,例如 、、searchcompare等;在服务器到达时解释服务器的响应。LDAPv3 客户端也可以再次 BIND,这将改变连接的授权状态。modifymodify DN

我不知道 whoami_s 做了什么(虽然有一个名为 WHO AM I 的 LDAP 扩展操作),但没有必要。乍一看,第一个代码示例应该可以工作。假设连接有效并且 BIND 成功,这就是所有需要的。如果还有更多,那么 API 就坏了。

不是真正的答案,对不起。

也可以看看

于 2013-11-13T13:19:01.673 回答