how example create configurar java tomcat ldap jndi

java - create - jndi tomcat 8 example



Intentando configurar LDAP como Recurso JNDI en Tomcat (2)

Tengo un servidor LDAP que estoy usando para autenticar usuarios dentro de una aplicación web tomcat. Estoy usando el JNDIRealm y está configurado dentro de un archivo de contexto y esto funciona muy bien.

También necesitaré buscar en el ldap la información del usuario. He descubierto cómo hacer esto con el "método jndi" y lo estoy trabajando bien fuera de tomcat al crear mi propio contexto jndi usando una tabla hash. Sin embargo, en lugar de configurar las propiedades jndi en el código, me gustaría crear un JNDI Rsource en mi archivo de contexto junto a la configuración de Realm.

Estoy pensando que haría algo como esto:

<Resource name="ldap" auth="Container" type="com.sun.jndi.ldap.LdapCtxFactory" java.naming.factory.initial="com.sun.jndi.ldap.LdapCtxFactory" java.naming.provider.url="ldap://localhost:389" java.naming.security.authentication="simple" java.naming.security.principal="uid=rjcarr,dc=example" java.naming.security.credentials="abc123" />

Pero o bien tomcat me dice que el recurso no se puede crear o cuando trato de inicializarlo con algo como esto:

Context initctx = new InitialContext(); DirContext ctx = (DirContext) initctx.lookup("java:comp/env/ldap");

Tomcat me dice "No se puede crear una instancia de recurso". También agregué el recurso-ref correcto en mi archivo web.xml, así que no creo que ese sea el problema.

Dado que LDAP se utiliza con el método JNDI, supongo que debería poder configurarse como un recurso, ¿no? ¿Qué me estoy perdiendo?


Lo estás inventando. El tipo de recurso de Tomcat debe ser una clase que implemente javax.naming.spi.ObjectFactory. Consulte la documentación de Tomcat para recursos personalizados.


Esta respuesta es un poco tarde, pero probablemente será útil para otros usuarios. Está basado en la respuesta de EJP .

La siguiente solución fue probada en Apache Tomcat 7 .
Si lo necesita, puede reemplazar LdapContext por DirContext .

Crear un ObjectFactory

Cree una clase que implemente ObjectFactory para instanciar un LdapContext :

public class LdapContextFactory implements ObjectFactory { public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception { Hashtable<Object, Object> env = new Hashtable<Object, Object>(); 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(); switch (type) { case Context.INITIAL_CONTEXT_FACTORY: env.put(Context.INITIAL_CONTEXT_FACTORY, content); break; case Context.PROVIDER_URL: env.put(Context.PROVIDER_URL, content); break; case Context.SECURITY_AUTHENTICATION: env.put(Context.SECURITY_AUTHENTICATION, content); break; case Context.SECURITY_PRINCIPAL: env.put(Context.SECURITY_PRINCIPAL, content); break; case Context.SECURITY_CREDENTIALS: env.put(Context.SECURITY_CREDENTIALS, content); break; default: break; } } LdapContext context = new InitialLdapContext(env, null); return context; } }

Define tu recurso

Agregue lo siguiente a su context.xml , haciendo referencia a la fábrica y definiendo los valores para crear una instancia de LdapContext :

<?xml version="1.0" encoding="UTF-8"?> <Context> ... <Resource name="ldap/LdapResource" auth="Container" type="javax.naming.ldap.LdapContext" factory="com.company.LdapContextFactory" singleton="false" java.naming.factory.initial="com.sun.jndi.ldap.LdapCtxFactory" java.naming.provider.url="ldap://127.0.0.1:389" java.naming.security.authentication="simple" java.naming.security.principal="username" java.naming.security.credentials="password" /> </Context>

Si necesita agregar más atributos / valores a su recurso, considere actualizar su ObjectFactory creado arriba para leer estos nuevos atributos / valores.

Usa tu recurso

Inyecte su recurso donde lo necesite:

@Resource(name = "ldap/LdapResource") private LdapContext bean;

O búsquelo:

Context initialContext = new InitialContext(); LdapContext ldapContext = (LdapContext) initialContext.lookup("java:comp/env/ldap/LdapResource");

Ver más

La documentación de Apache Tomcat explica cómo agregar fábricas de recursos personalizados .