我正在尝试使用搜索过滤器来使用LDAPObject.search_s()
。
当我有一个没有()
的参数时,这非常正常,但是当过滤器中存在()
时,这会失败。
例如,当我查找
组时 "(name=(Test Group))"
,会引发ldap.FILTER_ERROR
,但当我使用"(name=Test Group)"
作为过滤器时,就没有问题。
如何搜索有parens的群组?
参考:
http://www.python-ldap.org/doc/html/ldap.html?highlight=initialize#ldap-objects
答案 0 :(得分:8)
您应该使用ldap.filter模块。它已经包含了需要转义的所有规则。
>>> import ldap.filter
>>> ldap.filter.filter_format('(cn=%s)', ['(Test Group)',])
'(cn=\\28Test Group\\29)'
答案 1 :(得分:1)
Section 3 of RFC4515表示必须转义括号(parenthèses)和其他特殊字符。
规则确保整个过滤字符串是有效的UTF-8字符串,并提供表示ASCII字符“*”(ASCII 0x2a),“(”(ASCII 0x28),“)”(ASCII 0x29)的八位字节),“\”(ASCII 0x5c)和NUL(ASCII 0x00)表示为反斜杠“\”(ASCII 0x5c),后跟表示编码八位字节值的两个十六进制数字。
Python使编码变得容易。只需使用反斜杠(\
)转义特殊字符。搜索名为“测试组”的组,您的搜索过滤器将为:
'(cn=\(test group\))'
(使用带有OpenLDAP服务器的python-ldap版本2.4.10测试)