0

ユーザーが LDAP データを管理できるように、Spring ベースの Web アプリケーションを実現する必要があります。LDAP への接続は、JNDI フレームワークでのみ行う必要があります (SpringLDAP は許可されません)。

このために、基本的な操作 (追加、更新、削除、一覧表示など) を実行するユーティリティ クラスを実現しました。

このクラスのコードの短いブロックを次に示します。

public class LdapUtility {


    private static LdapUtility instance;

    private DirContext dirContext;


    public static LdapUtility getInstance() {

        if(LdapUtility.instance == null)
            LdapUtility.instance = new LdapUtility();

        return LdapUtility.instance;
    }

    /**
     * Connect to the LDAP
     */
    private LdapUtility() {

        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://localhost:389");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,dc=my-domain,dc=com");
        env.put(Context.SECURITY_CREDENTIALS, "secret");

        try {
            dirContext = new InitialDirContext(env);
        }
        catch(Exception ex) {
            dirContext = null;
        }
    }

    public void addUser(User u) {

           dirContext.createSubcontext(....); //add user in the LDAP
    }
}

このコードでは、 を呼び出してすべてのメソッドにアクセスできますLdapUtility.getInstance()...が、LDAP への接続は決して解放されません。

別の方法は、各操作の前に LDAP に接続することですが、この場合、LDAP への接続が多すぎます...

だから、ここに私の質問があります:これらのメソッドにアクセスするための最もエレガントでスマートな方法は何ですか?

前もって感謝します :-)

4

4 に答える 4

1

春がなければ(禁止されている)、私はすぐに似たようなものを実装します:

  • (怠惰な場合)単純なコールバックインターフェイスを作成します(春に見られるようなもの-JpaCallback.execute(EntityManager em))-ただし、LDAPの場合-MyLdapCallback.execute(LdapConnection接続)-LdapConnectionの代わりに想像できます必要なもの -- OpenLdap または SDK Context からのオブジェクト。次のようなもの(プレゼンテーション用):
...
interface LdapCallback<T> {
    T execute(DirContext ctx) throws NamingException, IOException;
}
...
private <T> T execute(LdapCallback<T> callback) throws NamingException, IOException {
    T result = null;
    LdapContext ctx = new InitialLdapContext();
    try {
        result = callback.execute(ctx);
    } finally {
        if (tls != null) {
            tls.close();
        }
        ctx.close();
    }
    return result;
}
...

完了したら、LDAP 呼び出しごとに匿名クラスを作成し、execute(callback) を介してコールバックを呼び出します。

  • (より多くの時間をかけて) ad 1 を実装します。 + アノテーションでマークされたメソッドをラップする AOP を作成し、それ自体が上記のラッパー内でメソッドを実行します (コードで明示的に実行する必要はありません)。
于 2013-01-07T10:38:17.470 に答える
1

すでに Spring を使用しているため、Spring LDAPの使用をお勧めします。

Spring LDAP は、Spring の JdbcTemplate のパターンに基づいて、LDAP 操作を簡素化するための Java ライブラリです。フレームワークは、コンテキストの検索とクローズ、結果のループ、値とフィルターのエンコード/デコードなどの一般的な雑用からユーザーを解放します。

特に、LDAP と潜在的なパフォーマンスの問題に慣れていない場合は、このようなユーティリティ ライブラリを使い始めると、すべての面倒な作業を行うことができます。

spring config で LDAP 接続設定を構成します。

<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
  <property name="url" value="ldap://localhost:389" />
  <property name="base" value="dc=example,dc=com" />
  <property name="userDn" value="cn=Manager" />
  <property name="password" value="secret" />
</bean>

<bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate">
  <constructor-arg ref="contextSource" />
</bean>

LdapTemplateその後、LDAP アクションを実行する必要がある場所ならどこでも使用できます。

return ldapTemplate.search(
     "", "(objectclass=person)",
     new AttributesMapper() {
        public Object mapFromAttributes(Attributes attrs)
           throws NamingException {
           return attrs.get("cn").get();
        }
     });
于 2013-01-05T17:02:29.687 に答える
0

LDAP に接続するには、いくつかの方法があります。javax.naming.* の使用はその 1 つです。javadoc では、SPI プロバイダーのクラスが独自の接続を管理しているため、気にしない場合があります。これは質問への回答かもしれません。JDK のドキュメントと、コンテキストが接続とネットワークを管理する方法を参照してください。http ://docs.oracle.com/javase/6/docs/api/javax/naming/ldap/LdapContext.html .

JDBC に似たアクセスに慣れている場合は、http: //www.openldap.org/jldap/ が好みに合うかもしれません。そこには接続が完全に制御されており、それらを JDBC の場合とほとんど同じように扱います。好きなプーリング ライブラリを使用できます。

于 2013-01-05T15:16:55.413 に答える
0

正確な要件がわからないので、核となる質問を「接続をいつ開閉するか」と解釈します。

私のクリスタルボールは、接続プールを使用したいかもしれないと言っています。確かに、これはプールによって処理されるため、明示的に接続を閉じる必要はありませんが、割り当てには問題ない場合があります。それはかなり簡単です:

// Enable connection pooling
env.put("com.sun.jndi.ldap.connect.pool", "true");

完全なソース コードは、Oracle の基本的な LDAP チュートリアルで参照されています

于 2013-01-05T21:43:10.360 に答える