8

Tomcat Web アプリケーション内でユーザーを認証するために使用している LDAP サーバーがあります。私は JNDIRealm を使用しており、コンテキスト ファイル内で構成されており、これはうまく機能します。

また、LDAP でユーザー情報を検索する必要があります。「jndiメソッド」でこれを行う方法を理解しました。ハッシュテーブルを使用して独自のjndiコンテキストを作成することにより、Tomcatの外部で正常に動作します。ただし、コードで jndi プロパティを構成する代わりに、Realm 構成のすぐ隣のコンテキスト ファイルに JNDI リソースを作成したいと考えています。

私はこのようなことをするだろうと考えています:

<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"
/>

しかし、Tomcat がリソースを作成できないことを通知するか、次のような方法でリソースを初期化しようとすると、次のようになります。

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

Tomcat から「リソース インスタンスを作成できません」と表示されます。また、web.xml ファイルに正しい resource-ref を追加したので、それは問題ではないと思います。

LDAP は JNDI メソッドで使用されているため、リソースとして構成できるはずだと思いますよね? 私は何が欠けていますか?

4

2 に答える 2

4

この回答は少し遅れていますが、おそらく他のユーザーに役立つでしょう。EJPの回答に基づいています。

次のソリューションは、Apache Tomcat 7でテストされました。
必要に応じて、 に置き換えることができLdapContextますDirContext

ObjectFactory を作成する

ObjectFactoryをインスタンス化するために実装するクラスを作成し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;
    }
}

リソースを定義する

以下を に追加してcontext.xml、ファクトリを参照し、値を定義して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>

リソースにさらに属性/値を追加する必要がある場合は、ObjectFactory上記で作成したものを更新して、これらの新しい属性/値を読み取ることを検討してください。

リソースを使用する

必要な場所にリソースを挿入します。

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

または調べてください:

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

続きを見る

Apache Tomcat のドキュメントでは、カスタム リソース ファクトリを追加する方法について説明しています。

于 2014-11-25T12:52:15.663 に答える
2

あなたはそれを作り上げています。Tomcat リソースのタイプは、javax.naming.spi.ObjectFactory を実装するクラスでなければなりません。カスタム リソースについては、Tomcat のドキュメントを参照してください。

于 2012-10-28T21:44:55.073 に答える