以用户名作为变量的 LDAP 搜索
LDAP search with username as variable
我正在使用 Python-LDAP 模块并尝试对登录用户进行查询。用户名将被传递到查询中。当我简单地将 用户名作为字符串输入时,我的结果会正确显示 。
但是如果我尝试将(用户名)变量传递给它returns
LDAPError - FILTER_ERROR: {'desc': u'Bad search filter'}
我尝试了多种不同的组合,但仍然返回相同的错误。这里有任何见解都会很棒!
针对最小、完整和可验证的示例进行了编辑:
import ldap
LDAP_SERVER = "ldap://myldapserver.domain.ad:389"
username = r"domain\serviceAccount"
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=domain\serviceAccount)
字符 \
不允许出现在过滤字符串中,除非它被转义。
如何解决这个问题取决于您的 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])
我正在使用 Python-LDAP 模块并尝试对登录用户进行查询。用户名将被传递到查询中。当我简单地将 用户名作为字符串输入时,我的结果会正确显示 。
但是如果我尝试将(用户名)变量传递给它returns
LDAPError - FILTER_ERROR: {'desc': u'Bad search filter'}
我尝试了多种不同的组合,但仍然返回相同的错误。这里有任何见解都会很棒!
针对最小、完整和可验证的示例进行了编辑:
import ldap
LDAP_SERVER = "ldap://myldapserver.domain.ad:389"
username = r"domain\serviceAccount"
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=domain\serviceAccount)
字符 \
不允许出现在过滤字符串中,除非它被转义。
如何解决这个问题取决于您的 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])