首页 > 解决方案 > LDAP 过滤器语法

问题描述

我正在使用 python 库 ldap3 向服务器发送请求,以查询未禁用且具有包含用户输入的显示名称或电子邮件的用户对象:

query = "(&(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(displayName={0}*)(mail={0}*))".format(value)

我遵循了我认为文档中有关形成 LDAP 过滤器的内容,但我收到了不正确的 LDAP 过滤器错误消息:

LDAPInvalidFilterError: malformed filter

我玩过它,这很有效:

query = "(&(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(displayName={0}*))".format(value) 

我还没有能够构建一个过滤器使用|。应该如何构造查询?

标签: pythonactive-directoryldapldap3

解决方案


您不能简单地.format()将任何值放入过滤器。

在将某些字符插入字符串之前,您需要对其进行转义。

* -> \2a
( -> \28
) -> \29
\ -> \5c
空 -> \00
/ -> \2f

就像使用 URL 一样,您可以使用上述方案自由转义您喜欢的任何字符,但以上是最低限度的。

我无法使用 | 构建过滤器 然而。应该如何构造查询?

话虽这么说,你有一个嵌套错误。格式化查询时会看到它:

(&
  (对象类=用户)
  (!(userAccountControl:1.2.840.113556.1.4.803:=2))
  (|
    (显示名称={0}*)
    (邮件={0}*)
  )

您仍然需要转义value,但由于 LDAP 服务器不在乎,请保持查询格式:

value = ldap3.utils.conv.escape_filter_chars(user_input)
query = f"""
(&
  (objectClass=user)
  (!(userAccountControl:1.2.840.113556.1.4.803:=2))
  (|
    (displayName={value}*)
    (mail={value}*)
  )
)
"""

推荐阅读