【发布时间】:2013-10-26 05:05:10
【问题描述】:
我目前正在正确地转义我的过滤器,或者使用 Spring LDAP 过滤器类,或者通过 LdapEncoder.filterEncode()。
同时,我正在使用 WireShark 来捕获在我的本地计算机和 LDAP 服务器之间交换的数据包。
而且我似乎有问题。即使我正确地转义了值(我已通过调试确认),它们也会通过网络未转义。我还确认(通过调试)该值一直保持编码,直到它进入 javax.naming.InitialContext。
这是一个示例(请注意,我使用的是 Spring LDAP 1.3.0,并且这些都发生在 Oracle JDK 6u45 和 Oracle JDK 7u45 上)。
在我自己的代码中,在服务层上,正在进行的调用是:
String lMailAddress = (String) ldapTemplate.searchForObject("", new EqualsFilter(ldapUserSearchFilterAttribute, principal).encode(), new ContextMapper() {
@Override
public Object mapFromContext(Object ctx) {
DirContextAdapter lContext = (DirContextAdapter) ctx;
return lContext.getStringAttribute("mail");
}});
至此,我可以确认filter上encode()方法返回的String是“(sAMAccountName=boi\2a)”
我可以调试代码的最后一点是以下(从 org.springframework.ldap.core.LdapTemplate 的第 229 行开始):
SearchExecutor se = new SearchExecutor() {
public NamingEnumeration executeSearch(DirContext ctx) throws javax.naming.NamingException {
return ctx.search(base, filter, controls);
}
};
稍后调用 executeSearch() 时,我还可以验证过滤器字符串是否包含“(sAMAccountName=boi\2a)”。
我无法进一步调试,因为我没有 javax,naming.* 或 com.sun.jndi.ldap.* 的源代码(因为正在调用 com.sun.jndi.ldap.LdapCtx)。
但是,一旦调用从 executeSearch() 返回,WireShark 就会通知我包含带有过滤器“(sAMAccountName=boi*)”的 searchRequest 的 LDAP 数据包已被传输(* 不再转义)。
我使用了类似的编码并使用了不同的 LdapTemplate 方法,产生了我期望的结果(我看到编码过滤器在 WireShark 中传输),但我无法解释为什么在我刚刚公开的情况下,值被解码在被传输之前。
请帮助我了解情况。不幸的是,我是一个没有正确理解 LDAP 协议的人。
谢谢。
免责声明:我已将相同的问题发布到 Spring LDAP 论坛。
TL/DR:为什么 com.sun.jndi.ldap.LdapCtx 在将 LDAP 编码过滤器(如 \2a 到 *)解码到 LDAP 服务器之前?
更新:用 IBM 的 J9 JDK7 尝试并观察到相同的行为。
【问题讨论】:
标签: java security spring-security ldap spring-ldap