Java 尝试在Tomcat中将LDAP配置为JNDI资源

Java 尝试在Tomcat中将LDAP配置为JNDI资源,java,tomcat,ldap,jndi,Java,Tomcat,Ldap,Jndi,我有一个ldap服务器,用于对tomcat web应用程序中的用户进行身份验证。我使用的是JNDIRealm,它在一个上下文文件中进行了配置,效果非常好 我还需要在ldap中搜索用户信息。我已经了解了如何使用“jndi方法”来实现这一点,并且通过使用哈希表创建自己的jndi上下文,在tomcat之外,我的jndi方法工作得很好。但是,我不想在代码中配置jndi属性,而是想在域配置旁边的上下文文件中创建一个JNDIRSource 我想我会这样做: <Resource name="lda

我有一个ldap服务器,用于对tomcat web应用程序中的用户进行身份验证。我使用的是JNDIRealm,它在一个上下文文件中进行了配置,效果非常好

我还需要在ldap中搜索用户信息。我已经了解了如何使用“jndi方法”来实现这一点,并且通过使用哈希表创建自己的jndi上下文,在tomcat之外,我的jndi方法工作得很好。但是,我不想在代码中配置jndi属性,而是想在域配置旁边的上下文文件中创建一个JNDIRSource

我想我会这样做:

<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"
/>
Context initctx = new InitialContext();
DirContext ctx = (DirContext) initctx.lookup("java:comp/env/ldap");
Tomcat告诉我“无法创建资源实例”。我还在web.xml文件中添加了正确的资源引用,所以我认为这不是问题所在


由于LDAP与JNDI方法一起使用,我假设它应该能够配置为资源,对吗?我错过了什么?

你在弥补。Tomcat资源的类型必须是实现javax.naming.spi.ObjectFactory的类。有关自定义资源,请参阅Tomcat文档。

这个答案有点晚,但可能对其他用户有用。这是基于

对以下溶液进行了测试。
如果需要,您可以替换为

创建对象工厂 创建一个类,该类实现实例化:

如果需要在资源中添加更多的属性/值,请考虑更新上面创建的这些属性/值。 利用你的资源 在任何需要的地方注入您的资源:

@Resource(name = "ldap/LdapResource")
private LdapContext bean;
或者查一下:

Context initialContext = new InitialContext();
LdapContext ldapContext = (LdapContext)
    initialContext.lookup("java:comp/env/ldap/LdapResource");
查看更多
Apache Tomcat的文档对此进行了解释。

或者您可以使用Tomcat的BeanFactory,它要求资源符合JavaBean规范。我无法让它工作,我的问题是(使用open bounty)
@Resource(name = "ldap/LdapResource")
private LdapContext bean;
Context initialContext = new InitialContext();
LdapContext ldapContext = (LdapContext)
    initialContext.lookup("java:comp/env/ldap/LdapResource");