LdapCtx无法强制转换为DirContextAdapter

时间:2015-11-17 22:28:53

标签: spring-security

我正在运行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");
    }

如何解决此问题?

2 个答案:

答案 0 :(得分:4)

去了解代码之后,终于找到了答案,我是自定义了AuthenticationProvider,在spring security 3.2之后,需要在创建DirContext时添加Context.OBJECT_FACTORIES

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 环境(例如服务器)中,需要将org.springframework.ldap.core.support的其他包导入添加到包的清单中,从而创建访问{的线程{3}}库。 这适用于 4.3.14.RELEASE 2.3.2.RELEASE版本3.x似乎不需要额外导入。