2015-11-17 3 views
2

Я бегу с Spring Security 3.2.9 RELEASE, пытаясь получить доступ к AD с помощью SpringSecurityLdapTemplate, столкнувшись с этой проблемой.LdapCtx нельзя отнести к DirContextAdapter

зависимостей весна-безопасность-3.2.9.RELEASE.jar LDAP весны-ядро 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, не знаю, почему он не может отличить.

Весь мой код работает нормально с пружинной безопасностью-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"); 
    } 

Как решить эту проблему?

ответ

3

После идти подумал код, наконец, нашел ответ, я был настроен AuthenticationProvider, после весенней безопасности 3.2, необходимо добавить Context.OBJECT_FACTORIES, когда создают DirContext

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()); 
Смежные вопросы