2017-05-04 284 views
0

我真的用完了想​​法。LDAP查询不起作用

我最近被分配来改进我们在Python中使用的脚本,以便它可以获取其电子邮件匹配字符串的所有用户(更确切地说,所有用户的电子邮件都与从HTML的文本输入中获得的值匹配)。

它通过使用此过滤器效果很好(“搜索”是从文本输入获得的文本):
user_filter = '(mail=%s)' % search

,但它需要的电子邮件值完全相同,因此它可以与用户的电子邮件匹配,我需要的是匹配任何写下来的值(字符串)。

上次使用的过滤器是这样的:
user_filter = '(mail=*%s*)' % search

而且这样的:
user_filter = '(mail=%s*)' % search

(请注意使用通配符)

,但没有一次成功。

任何想法,我可以做到这一点?你需要更多的上下文吗?

我使用LDAP和功能search_s

这是代码片段:

def ldap_query(query): 
""" returns the members of an LDAP group """ 

try: 
    ldap_conn = ldap.initialize(LDAP_URL) 
    ldap_conn.timeout = LDAP_TIMEOUT 

    ldap_conn.simple_bind(LDAP_USERNAME, LDAP_PASSWORD) 

    if not ldap_conn.whoami_s(): 
     raise Exception('503 Unable to authenticate to LDAP server with master user & password') 

    res = ldap_conn.search_s(LDAP_BASE_DN, ldap.SCOPE_SUBTREE, query) 

    if res == []: 
     raise Exception('Group not found in LDAP directory, using filter {}'.format(query)) 

    print res 

而我使用它是这样的:

print ldap_query('(mail=my[email protected])') 

但是如果我使用通配符,我最后出现了错误:

print ldap_query('(mail=a.name*)') 

EDITED 只是现在它开始工作,用最后一个过滤器(一个略高于此)。不知道为什么它以前没有工作。

+0

请提供演示错误的最短可能的完整程序。有关更多信息,请参见[mcve]。 –

回答

0

它运作良好只用一个通配符:

'(mail=a.name*) 

,而不是两个:

'(mail=*a.name*) 

我使用,因为使用MySQL“LIKE”查询,而我所看到的做法%string%,而LDAP过滤器似乎并非如此。

+0

它应该同时工作,但是前导通配符会很慢,因为它需要完全搜索,就像LIKE一样。尽量不要使用它。 – EJP

+0

将再次尝试使用两个通配符来确保它可以正常工作(或至少使其工作),也许还有一些缺失(在我的代码上)。 – DanielYoshua