以用户名作为变量的LDAP搜索



我正在使用Python-LDAP模块,并试图对登录用户进行查询。用户名将被传递到查询中。当我简单地输入用户名作为字符串时,我的结果会正确地输出

但是如果我尝试传递(username)变量它返回LDAPError - FILTER_ERROR: {'desc': u'Bad search filter'} 我尝试了许多不同的组合,但继续得到相同的错误返回。任何见解将是伟大的!

为最小、完整和可验证的示例编辑:

import ldap
LDAP_SERVER = "ldap://myldapserver.domain.ad:389"
username = r"domainserviceAccount"
password = "Password"
l = ldap.initialize(LDAP_SERVER)
def login(username, password):
    try:
        l.simple_bind_s(username, password)
        base = "OU=Users,OU=Group,DC=domain,DC=ad"
        criteria = "(&(objectClass=user)(sAMAccountName=anActualUsername))" #WORKS    
        criteria = '(&(objectClass=user)(sAMAccountName=%s))' % username #DOESNT WORK
        criteria = "(&(objectClass=user)" + "(sAMAccountName=" + username + "))" #DOESNT WORK
        attributes = ['displayName']
        result = l.search_s(base, ldap.SCOPE_SUBTREE, criteria, attributes)
        print result
    except ldap.INVALID_CREDENTIALS:
        return False
    return True
login(username,password)

您是否尝试对字符串进行编码?

criteria = ('(&(objectClass=user)(sAMAccountName=%s))' % username).encode('utf8')

在"WORKS"的情况下,您的过滤器字符串包含一个没有域的简单名称:

    (&(objectClass=user)(sAMAccountName=bobsmith))

在"DOESN'T WORK"的情况下,使用带有域的名称:

    (&(objectClass=user)(sAMAccountName=domainserviceAccount)

字符不允许出现在过滤器字符串中,除非它被转义。

如何解决这个问题取决于ldap服务器中存在的数据。也许这:
criteria = '(&(objectClass=user)(sAMAccountName=%s))' % (
    username if '\' not in username else username.split('\')[1])

或者这样:

criteria = '(&(objectClass=user)(sAMAccountName=%s))' % (
    ldap.filter.escape_filter_chars(username))

我需要使用ldap.filter。Filter_format用于字符转义。

import ldap.filter
criteria= ldap.filter.filter_format('(&(objectClass=user)(sAMAccountName=%s))', [username])

试着把单引号换成双引号。

criteria = "(&(objectClass=user)(sAMAccountName=anActualUsername))" #WORKS    
criteria = '(&(objectClass=user)(sAMAccountName=%s))' % username #DOESNT WORK

第二个条件将其更改为这个(我没有尝试使用%s,而是只使用字符串):

criteria = "(&(objectClass=user)(sAMAccountName=%s))" % username #SHOULD WORK

相关内容

  • 没有找到相关文章

最新更新