Tomcat 8 - LDAP: NameNotFoundException-Fehlercode 32, verbleibender Name leere Zeichenfolge

Versuchen, eine Anwendung von WebLogic zu migrieren 12.2.1 zu Tomcat 8.5.4, was war unter Weblogic ein Eintrag als Ausländische JNDI-Anbieter für eine LDAP-Verbindung wurde auf ein neues @ migrieResource unter Tomcat.

Folgendieser Rat on Stack Overflow, ein benutzerdefiniertesLdapContextFactory wurde als neues @ gepacjar Datei unter Tomcatlib Mappe

In the Tomcatserver.xml Datei die folgendenGlobalNamingResources/Resource wurde konfiguriert:

    <Resource name="ldapConnection" 
        auth="Container"
        type="javax.naming.ldap.LdapContext"
        factory="com.sample.custom.LdapContextFactory"
        singleton="false"
        java.naming.referral="follow"
        java.naming.factory.initial="com.sun.jndi.ldap.LdapCtxFactory"
        java.naming.provider.url="ldap://some.host:389"
        java.naming.security.authentication="simple"
        java.naming.security.principal="CN=some,OU=some,OU=some,DC=some,DC=a,DC=b"
        java.naming.security.credentials="password"
        com.sun.jndi.ldap.connect.pool="true"
        com.sun.jndi.ldap.connect.pool.maxsize="10"
        com.sun.jndi.ldap.connect.pool.prefsize="4"
        com.sun.jndi.ldap.connect.pool.timeout="30000" />

Die obige Verbindung funktioniert einwandfrei, wenn Sie das LDAP-Verzeichnis mit einem in Eclipse eingebetteten LDAP-Browser wie Apache Directory Studio / LDAP-Browser durchsuchen.

Der Brauchcom.sample.custom.LdapContextFactory ist ganz einfach:

public class LdapContextFactory implements ObjectFactory {

    public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment)
            throws Exception {

        Hashtable<Object, Object> env = new Hashtable<>();
        Reference reference = (Reference) obj;
        Enumeration<RefAddr> references = reference.getAll();

        while (references.hasMoreElements()) {
            RefAddr address = references.nextElement();
            String type = address.getType();
            String content = (String) address.getContent();
            env.put(type, content);
        }
        return new InitialLdapContext(env, null);
    }
}

Beim Start löst Tomcat jedoch die folgende Ausnahme aus:

07-Sep-2016 15:04:01.064 SEVERE [main] org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans Exception processing Global JNDI Resources
 javax.naming.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-031001E5, problem 2001 (NO_OBJECT), data 0, best match of:
    ''
 ]; remaining name ''
    at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3160)
    at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:3081)
    at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2888)
    at com.sun.jndi.ldap.LdapCtx.c_listBindings(LdapCtx.java:1189)
    at com.sun.jndi.toolkit.ctx.ComponentContext.p_listBindings(ComponentContext.java:592)
    at com.sun.jndi.toolkit.ctx.PartialCompositeContext.listBindings(PartialCompositeContext.java:330)
    at com.sun.jndi.toolkit.ctx.PartialCompositeContext.listBindings(PartialCompositeContext.java:317)
    at javax.naming.InitialContext.listBindings(InitialContext.java:472)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:136)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:145)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:110)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.lifecycleEvent(GlobalResourcesLifecycleListener.java:82)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:94)
    at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:401)
    at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:345)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:784)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:655)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:355)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:495)

Ähnlic Fragen und Untersuchungen deuten auf einen ungültigen LDAP-DN hin, aber:

Die gleiche LDAP-Konfiguration funktioniert auch über einen LDAP-Client Zum Startzeitpunkt wird keine Suche durchgeführt. Tomcat löst diese Ausnahme ohne Abfrage aus. Der Fehler schlägt eine leere Zeichenfolge vor'' wieremaining name, also nicht wirklich etwas nicht gefunden, anscheinend

Fragen: Ist dies der richtige Weg, um ein @ zu migriere Ausländische JNDI-Anbieter Eintrag von WebLogic zu Tomcat? Wie behebe ich einen ungültigen LDAP-DN-Eintrag mit einem leeren verbleibenden Namen? Könnte es ein fehlendes @ sebaseDN irgendwo konfigurieren?

Aktualisiere
Der gleiche genaue Fehler tritt beim Ändern des @ aLdapContextFactory zu Folgendem, wie über Kommentare vorgeschlagen:

public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment)
        throws Exception {

    Hashtable<Object, Object> env = new Hashtable<>();
    Reference reference = (Reference) obj;
    Enumeration<RefAddr> references = reference.getAll();

    String providerUrl = "no valid URL";

    while (references.hasMoreElements()) {
        RefAddr address = references.nextElement();
        String type = address.getType();
        String content = (String) address.getContent();

        switch (type) {
        case Context.PROVIDER_URL:
            env.put(Context.PROVIDER_URL, content);
            providerUrl = content;
            break;

        default:
            env.put(type, content);
            break;
        }
    }

    InitialLdapContext context = null;
    Object result = null;
    try {
        context = new InitialLdapContext(env, null);

        LOGGER.info("looking up for " + providerUrl);
        result = context.lookup(providerUrl);
    } finally {
        if (context != null) {
            context.close();
        }
    }
    LOGGER.info("Created new LDAP Context");
    return result;
}

Change wird über die Protokollierung bestätigt, um sicherzustellen, dass es ordnungsgemäß bereitgestellt wurde.

Der beteiligte Listener wird standardmäßig oben im @ definierserver.xml Datei als

<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

Und kann nicht gemäß @ deaktiviert werdoffizielle Dokumentation:

Der Global Resources Lifecycle Listener initialisiert die in @ definierten globalen JNDI-Ressourceserver.xml als Teil des Global Resources-Elements. Ohne diesen Listener ist keine der globalen Ressourcen verfügbar.

Das gleiche passiert auch bei der Tomcat-Version 8.5.5 und 7.0.69: Durch einfaches Hinzufügen der neuen globalen Ressource wie oben und der zusätzlichen JAR-Datei, die die Factory oben bereitstellt, wird die Ausnahme ausgelöst, die auf einen leeren verbleibenden Namen zeigt.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage