1. 概述
在这个教程中,我们将创建一个命令行接口(CLI)应用程序,用于测试连接到任何LDAP身份验证服务器。我们不会使用LDAP来保护我们的应用,因为可以更好地通过Spring Security LDAP实现。
在开发使用它们的应用程序之前,拥有一个快速检查LDAP连接有效性的工具非常有用。在应用程序之间进行某种集成时,特别是在设置阶段也很有用。而且,我们将完全使用核心Java类来实现,所以不需要额外依赖。
2. LDAP Java客户端
首先,让我们创建唯一的类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();
}
最后,我们使用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
同时指定query
、user
和password
,我们可以使用特定用户但查询其他用户。这对于需要作为管理员登录并执行查询的情况很有用。类似地,如果使用具有足够权限的用户连接,我们可以看到受保护的属性,如密码。
最后,当处理简单的参数时,作为输入传递系统属性是可以的。但是,开发CLI应用程序有更优雅的方式,比如Spring Shell。对于更复杂的内容,我们应该使用类似的东西。
5. 总结
在这篇文章中,我们创建了一个CLI应用程序,可以连接到LDAP服务器并运行连接测试。在单元测试中有更多应用使用示例。如往常一样,源代码可在GitHub上找到此处。