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, anscheinendFragen: 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.