我正在运行Spring Security 3.2.9 RELEASE,尝试使用SpringSecurityLdapTemplate访问AD,同时遇到此问题。
依赖性是 弹簧安全LDAP的3.2.9.RELEASE.jar 弹簧LDAP的芯 - 1.3.2.RELEASE.jar
问题详情如下: java.lang.ClassCastException:com.sun.jndi.ldap.LdapCtx无法强制转换为org.springframework.ldap.core.DirContextAdapter 在org.springframework.security.ldap.SpringSecurityLdapTemplate.searchForSingleEntryInternal(SpringSecurityLdapTemplate.java:219)
来自代码
try {
while (resultsEnum.hasMore()) {
SearchResult searchResult = resultsEnum.next();
DirContextAdapter dca = (DirContextAdapter) searchResult.getObject();
Assert.notNull(dca, "No object returned by search, DirContext is not correctly configured");
if (logger.isDebugEnabled()) {
logger.debug("Found DN: " + dca.getDn());
}
results.add(dca);
}
} catch (PartialResultException e) {
LdapUtils.closeEnumeration(resultsEnum);
logger.info("Ignoring PartialResultException");
}
似乎是在尝试将搜索结果投射到DirContextAdapter,不知道它为什么不能投射。
我的所有代码都运行良好,使用spring-security-3.1.0 Release,因为3.1.0使用了不同的逻辑
try {
while (resultsEnum.hasMore()) {
SearchResult searchResult = resultsEnum.next();
// Work out the DN of the matched entry
DistinguishedName dn = new DistinguishedName(new CompositeName(searchResult.getName()));
if (base.length() > 0) {
dn.prepend(searchBaseDn);
}
if (logger.isDebugEnabled()) {
logger.debug("Found DN: " + dn);
}
results.add(new DirContextAdapter(searchResult.getAttributes(), dn, ctxBaseDn));
}
} catch (PartialResultException e) {
LdapUtils.closeEnumeration(resultsEnum);
logger.info("Ignoring PartialResultException");
}
如何解决此问题?
答案 0 :(得分:4)
env.put(Context.PROVIDER_URL, bindUrl);
env.put(Context.SECURITY_CREDENTIALS, password);
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.OBJECT_FACTORIES, DefaultDirObjectFactory.class.getName());
答案 1 :(得分:1)
为了解决异常
java.lang.ClassCastException: com.sun.jndi.ldap.LdapCtx cannot be cast to org.springframework.ldap.core.DirContextAdapter
at org.springframework.security.ldap.SpringSecurityLdapTemplate.searchForSingleEntryInternal(SpringSecurityLdapTemplate.java:345)
在 OSGi 环境(例如apache-karaf服务器)中,需要将org.springframework.ldap.core.support
的其他包导入添加到包的清单中,从而创建访问{的线程{3}}库。
这适用于spring-ldap 4.3.14.RELEASE
和spring-framework 2.3.2.RELEASE
。 spring-ldap版本3.x
似乎不需要额外导入。