1. 概述

在这个教程中,我们将创建一个命令行接口(CLI)应用程序,用于测试连接到任何LDAP身份验证服务器。我们不会使用LDAP来保护我们的应用,因为可以更好地通过Spring Security LDAP实现

在开发使用它们的应用程序之前,拥有一个快速检查LDAP连接有效性的工具非常有用。在应用程序之间进行某种集成时,特别是在设置阶段也很有用。而且,我们将完全使用核心Java类来实现,所以不需要额外依赖

2. LDAP Java客户端

首先,让我们创建唯一的类LdapConnectionTool。我们从main方法开始。为了保持简单,所有逻辑都将在那里:

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

首先,我们将参数作为系统属性传递。对于factoryLdapCtxFactory)和authTypesimple)变量,我们将使用默认值。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();
}

最后,我们使用context变量根据可选的query查询所有属性

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

同时指定queryuserpassword,我们可以使用特定用户但查询其他用户。这对于需要作为管理员登录并执行查询的情况很有用。类似地,如果使用具有足够权限的用户连接,我们可以看到受保护的属性,如密码

最后,当处理简单的参数时,作为输入传递系统属性是可以的。但是,开发CLI应用程序有更优雅的方式,比如Spring Shell。对于更复杂的内容,我们应该使用类似的东西。

5. 总结

在这篇文章中,我们创建了一个CLI应用程序,可以连接到LDAP服务器并运行连接测试。在单元测试中有更多应用使用示例。如往常一样,源代码可在GitHub上找到此处