我正在将JNDI用于LDAP和Active Directory。
根据filter page,有一个符号~=
,其中包含以下描述:
〜=近似相等(根据属性的匹配规则)
这是什么意思?
我在想输入和Active Directory属性值之间存在Levenshtein距离,并且距离必须小于阈值,但似乎它不能以这种方式工作。
我尝试了以下示例:
NamingEnumeration<SearchResult> answer = ctx.search(
"dc=x,dc=y,dc=z", // name
"(cn~=John Smith)", // filter
searchCtls // controls
);
返回与
完全相同的条目NamingEnumeration<SearchResult> answer = ctx.search(
"dc=x,dc=y,dc=z", // name
"(cn=John Smith)", // filter
searchCtls // controls
);
这很好,但是如果我使用的话它什么也不返回:
"(cn~=jJohn Smith)", // filter
或
"(cn~=ohn Smith)", // filter
或
"(cn~=Gohn Smith)", // filter
或
"(cn~=JohnSmith)", // filter
当我选择整数而不是该字符串时,结果相似(例如:abc~=123
而不是cn~=John Smith
)。
因此,我认为=
和~=
之间没有区别。
修改
我发现了一个区别,但这不是预期的。
这不会返回任何内容:
"(cn~=J*n Smith)", // filter
虽然这会返回John Smith
条目:
"(cn=J*n Smith)", // filter
答案 0 :(得分:2)
尽管RFC 4511中提到了approxMatch,但没有规范定义如何实现或使用它。因此,aboutMatch将留给LDAP服务器实现它的工作原理。
恕我直言,它“被”用作“类似声音”的算法。
近似匹配过滤器可用于确定条目是否包含大约等于给定值的指定属性的至少一个值。 LDAP规范没有定义“近似等于”的含义,因此需要由各个服务器实现来确定。许多服务器使用基于Soundex或Metaphone变体之一的算法的“类似声音”机制。
近似匹配过滤器的字符串表示形式如下:
- 一个左括号
- 属性说明(可能包括属性选项)
- 波浪号角色
- 等号
- 要比较的值(又称断言值)
- 一个紧密的括号
例如,期望“(givenName~ = John)”的过滤器匹配具有John或Jon的givenName值的条目可能是合理的。
虽然它似乎是一个重要的疏忽或遗漏,但LDAP规范并未对近似匹配规则做出任何规定。许多目录服务器无论如何都提供此功能,因此可以在每个属性的基础上配置近似匹配行为,但服务器实现之间的近似匹配功能的不一致使得在LDAP启用时经常避免的大致匹配应用