Ldap学習日記-Ldap接続

4335 ワード

ldapsdk.jarを使用してLdapサーバipnaletに接続する手順は、次のとおりです.
1.接続プールを取得する.
Ldapsdkは接続プールクラスConnectionPoolを提供し、構造関数によって接続プールを構築することができる.明らかに、この動作はsingletonにカプセル化されるべきである.
  
ConnectionPool = new ConnectionPool(MIN_CONN_SIZE, MAX_CONN_SIZE, HOST, PORT)

パラメータの意味は明らかで、1番目は接続プールの最小接続数を定義し、2番目のパラメータは接続プールの最大接続数を定義し、3番目のパラメータは接続するLdapホストアドレスを指定し、4番目のパラメータはポートである.
2.接続を取得して閉じる.
接続はConnectionPoolが提供するgetConnection()メソッドで取得できますが、最後にclose(LDAPConnection)メソッドを呼び出して接続プールに戻す必要があります.そうしないと、接続が漏れる危険があります.
3.接続と検証
ldapサーバに接続するにはアカウントが必要です.このアカウントはConnection.authenticate(String dn,String password)によって指定されます.つまり、このようなコードを使用して検証し、接続する必要があります.
String dn = “uid=Frederick, ou=users, o=frederick.iteye.com”;
String password = “password”;
Connection.authenticate(dn, password);

4.検証済みのConnectionオブジェクトを使用して、関連操作を行うことができます.操作に使用するアカウントがldapであると仮定します.connection、パスワードはpasswordで、完全なコードは以下の通りです.
import netscape.ldap.LDAPConnection;
import netscape.ldap.LDAPException;
import netscape.ldap.util.ConnectionPool;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import fred.envoy.exception.util.LdapUtilsException;

public class LdapUtils {
    
    private static final Log log = LogFactory.getLog(LdapUtils.class);

    private static final String HOST = "frederick.iteye.com";
    
    private static final int PORT = 10389;
    
    private static final int MIN_CONN_SIZE = 1;
    
    private static final int MAX_CONN_SIZE = 5;
    
    private static final String USER_ID = "ldap_connection";
    
    private static final String PASSWORD = "password";
    
    private static final ConnectionPool connPool;
    
    static {
        try {
            connPool = new ConnectionPool(MIN_CONN_SIZE, MAX_CONN_SIZE, HOST, PORT);
        } catch (LDAPException e) {
            String message = "Failed to init Ldap connection pool";
            if (log.isErrorEnabled()) {
                log.error(message, e);
            }
            throw new LdapUtilsException(message, e);
        }
    }
    
    public static ConnectionPool getConnectionPool() {
        return LdapUtils.connPool;
    }
    
    public static LDAPConnection getConnection() {
        LDAPConnection conn = LdapUtils.getConnectionPool().getConnection();
        try {
            conn.authenticate(LdapUtils.getDnForUser(USER_ID), PASSWORD);
        } catch (LDAPException e) {
            String message = "Failed to authen the system ldap user";
            if (log.isErrorEnabled()) {
                log.error(message, e);
            }
            throw new LdapUtilsException(message, e);
        }
        
        return conn;
    }
    
    public static void closeConnection(LDAPConnection conn) {
        LdapUtils.getConnectionPool().close(conn);
    }

    public static String getDnForUser(String userId) {
        return new StringBuffer()
           .append("uid=").append(userId).append(",")
           .append("ou=users,o=frederick.iteye.com")
           .toString();
    }
}

5.もちろん、接続プールではなく、単一の接続を直接指定することもできます.

LDAPConnection conn = new LDAPConnection();
try {
    conn.connect(HOST, PORT);
} catch (LDAPException e1) {
    throw new RuntimeException(e);
}

このような単一の接続を使用するメリットは、複数のサーバを一度に指定できることです.これにより、接続時に1つのサーバに正常に接続されるまで、1つのサーバを1つずつ試してみることができます.

LDAPConnection conn = new LDAPConnection();
try {
    conn.connect("host1:port1 host2:port2 hostn:portn", LDAPv3.DEFAULT_PORT);
} catch (LDAPException e1) {
    throw new RuntimeException(e);
}

ここで、各サーバは「サーバ名:ポート名」のフォーマットに一致し、サーバ間はスペースで区切らなければなりません.各サーバは独自のポートを指定できますが、最後にデフォルトのポートパラメータが必要です.あるサーバがポートを指定せずにサーバ名のみを指定した場合、接続は指定したデフォルトポートを使用して接続しようとします.