1. 概要

このチュートリアルでは、 CLI アプリケーションを作成して、LDAP認証サーバーへの接続をテストします。 アプリケーションを保護するためにLDAPを使用しません。これは、たとえばSpringセキュリティLDAPを使用するとより適切に実行できるためです。

LDAP接続の有効性をすばやくチェックするツールがあると、LDAP接続を使用するアプリケーションを開発する前でも役立ちます。 また、特にセットアップフェーズで、アプリケーション間のある種の統合を開発する場合にも役立ちます。 コアJavaクラスを使用して実行します。 したがって、追加の依存関係は必要ありません

2. LDAPJavaクライアント

唯一のクラスLdapConnectionToolを作成することから始めましょう。 mainメソッドから始めます。 物事を単純にするために、すべてのロジックはここにあります。

public class LdapConnectionTool {
    public static void main(String[] args) {
        // ...
    }
}

まず、パラメータをシステムプロパティとして渡します。 factory LdapCtxFactory)および authType simple )変数のデフォルト値を使用します。 LdapCtxFactory は、サーバーへの接続とユーザー属性の入力のプロセス全体を担当するコアJavaクラスです。 また、 simple 認証タイプは、パスワードがクリアテキストとして送信されることを意味します。 同様に、 query変数をuser、にデフォルト設定して、一方または両方を指定できるようにします。 使用法の詳細については、後で説明します。

String factory = System.getProperty("factory", "com.sun.jndi.ldap.LdapCtxFactory");
String authType = System.getProperty("authType", "simple");
String url = System.getProperty("url");
String user = System.getProperty("user");
String password = System.getProperty("password");
String query = System.getProperty("query", user);

次に、InitialDirContextを使用した接続に必要なすべてのプロパティを保持する環境マップを作成します。

Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, factory);
env.put(Context.SECURITY_AUTHENTICATION, authType);
env.put(Context.PROVIDER_URL, url);

一部のサーバーは匿名アクセスを許可しているため、ユーザーとパスワードは必要ありません

if (user != null) {
    env.put(Context.SECURITY_PRINCIPAL, user);
    env.put(Context.SECURITY_CREDENTIALS, password);
}

接続をテストするとき、間違ったURLを渡すか、サーバーが単に応答しないことがよくあります。 デフォルトのクライアント動作は応答を受信するまで無期限にブロックされるため、タイムアウトパラメータを定義します。 待機時間はミリ秒単位で定義されます。

env.put("com.sun.jndi.ldap.read.timeout", "5000");
env.put("com.sun.jndi.ldap.connect.timeout", "5000");

その後、基本的な例外処理とともに、InitialDirContextの新しいインスタンスとの接続を確立しようとします。 これは、一般的な問題の診断に使用するため、不可欠です。 同様に、CLIアプリケーションを開発しているため、メッセージを標準出力に出力します。

DirContext context = null;
try {
    context = new InitialDirContext(env);
    System.out.println("success");
    // ...
} catch (NamingException e) {
    System.out.println(e.getMessage());
} finally {
    context.close();
}

最後に、コンテキスト変数を使用して、オプションのクエリから生じるすべての属性をクエリします

if (query != null) {
    Attributes attributes = context.getAttributes(query);
    NamingEnumeration<? extends Attribute> all = attributes.getAll();
    while (all.hasMoreElements()) {
        Attribute next = all.next();

        String key = next.getID();
        Object value = next.get();

        System.out.println(key + "=" + value);
    }
}

3. よくある間違い

このセクションでは、サーバーに接続しようとしたときに発生する一般的な間違いとエラーメッセージについて説明します。

  • 間違ったベースDN:ベースDNを適切に設定しないと、「エラーコード49 –無効な資格情報」が表示されます。 すべてのサーバーには独自の構造があるため、このメッセージは誤解を招く可能性があるため、常に最初にこれを確認する必要があります
  • 匿名接続なし:匿名アクセスを許可するようにサーバーを構成しないと、「ERR_229ユーザーを認証できません」というエラーが発生します。

4. 使用法

これですべてのセットアップが完了したので、アプリケーションを使用できます。 まず、 jar としてビルドし、名前を ldap-connection-tool.jar、に変更してから、次のいずれかの例を試してみましょう。 これらの値はサーバー構成に完全に依存していることに注意してください。

ユーザーとパスワードで接続する:

java -cp ldap-connection-tool.jar \
-Durl=ldap://localhost:389 \
-Duser=uid=gauss,dc=baeldung,dc=com \
-Dpassword=password \
com.baeldung.jndi.ldap.connectionTool.LdapConnectionTool

クイック接続テストのためにサーバーURLのみを指定する:

java -cp ldap-connection-tool.jar \
-Durl=ldap://localhost:389 \
com.baeldung.jndi.ldap.connectionTool.LdapConnectionTool

また、queryuserおよびpasswordを指定すると、特定のユーザーに接続できますが、別のユーザーにクエリを実行できます。 これは、クエリを実行する前など、管理者として接続する必要がある場合に役立ちます。 同様に、十分な権限を持つユーザーと接続すると、パスワードなどの保護された属性を確認できます。

最後に、単純なパラメータを扱う場合は、システムプロパティを入力として渡すことで問題ありません。 ただし、 Spring Shell など、CLIアプリケーションを開発するためのより洗練された方法があります。 もっと複雑なものには、そのようなものを使用する必要があります。

5. 結論

この記事では、LDAPサーバーに接続して接続テストを実行できるCLIアプリケーションを作成しました。 また、単体テストにはさらに多くのアプリケーションの使用例があります。 そしていつものように、ソースコードはGitHub利用できます。