A simple Java LDAP Client

This step-by-step guide will show you how to create a minimal Java LDAP Client to test the connection to an LDAP Server and show the LDAP tree using a graphical interface. We will use Docker to trigger a simple LDAP Server so you don’t need to install anything!

Step # 1 Start LDAP with Docker

There are several open source LDAP distributions. In this tutorial we will start openldap using the following Docker command:

docker run --rm --name my-ldap \
  --env LDAP_ORGANISATION="Example Org" \
  --env LDAP_DOMAIN="example.org" \
  --env LDAP_ADMIN_PASSWORD="admin" \
  --publish 389:389 \
  --detach osixia/openldap:1.5.0

Then, verify that LDAP is running on your localhost, forwarding traffic from the local port 389 to the container port 389:

docker ps
CONTAINER ID   IMAGE                   COMMAND                 CREATED             STATUS             PORTS                                            NAMES
f3e9384a0b1f   osixia/openldap:1.5.0   "/container/tool/run"   About an hour ago   Up About an hour   0.0.0.0:389->389/tcp, :::389->389/tcp, 636/tcp   my-ldap

Next, we need to insert some example users in it. For example, the following users.ldif will define two Users for the domain dc=example,dc=org:

dn: ou=users,dc=example,dc=org
objectClass: organizationalUnit
ou: users

dn: uid=jdoe,ou=users,dc=example,dc=org
objectClass: inetOrgPerson
cn: John Doe
sn: Doe
uid: jdoe
mail: [email protected]
userPassword: password123

dn: uid=asmith,ou=users,dc=example,dc=org
objectClass: inetOrgPerson
cn: Alice Smith
sn: Smith
uid: asmith
mail: [email protected]
userPassword: password123

Finally, you can load the LDIF file directly into the Docker container with:

docker exec -i my-ldap ldapadd -x -D "cn=admin,dc=example,dc=org" -w admin < users.ldif

That’s all. Let’s wrap a simple Java code as Client

Step #2 Writing the java LDAP Client

To code the Java Client we will use a simple set of libraries:

  • The UnboundID LDAP SDK for Java is a fast, powerful, user-friendly, and completely free Java library for communicating with LDAP directory servers.
  • Java Swing to display the LDAP tree

Finally, we will use JBang to bundle the dependencies. if you are new to JBang you can check this article: JBang: Create Java scripts like a pro

//DEPS com.unboundid:unboundid-ldapsdk:6.0.7

import com.unboundid.ldap.sdk.*;
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.*;
import java.util.*;

public class ldaptree {

    public static void main(String[] args) throws Exception {
        // Connessione al server LDAP
        LDAPConnection connection = new LDAPConnection("localhost", 389, "cn=admin,dc=example,dc=org", "admin");

        String baseDN = "dc=example,dc=org";
        SearchResult result = connection.search(baseDN, SearchScope.SUB, "(objectClass=*)");

        // Crea la radice del JTree
        DefaultMutableTreeNode root = new DefaultMutableTreeNode(baseDN);

        // Mappa per costruire l'albero gerarchico
        Map<String, DefaultMutableTreeNode> nodeMap = new HashMap<>();
        nodeMap.put(baseDN, root);

        // Ordina DN in base alla profondità per evitare problemi di ordine
        result.getSearchEntries().stream()
            .sorted(Comparator.comparingInt(e -> e.getDN().split(",").length))
            .forEach(entry -> {
                String dn = entry.getDN();
                if (!dn.equalsIgnoreCase(baseDN)) {
                    try {
                        String parentDN = entry.getParentDNString();  // Aggiunto try-catch
                        DefaultMutableTreeNode parentNode = nodeMap.get(parentDN);
                        if (parentNode != null) {
                            DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(dn);
                            parentNode.add(newNode);
                            nodeMap.put(dn, newNode);
                        }
                    } catch (LDAPException e) {
                        e.printStackTrace();  // Stampa l'errore
                    }
                }
            });

        // Costruzione interfaccia grafica
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("LDAP Tree Viewer");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JTree tree = new JTree(root);
            JScrollPane scrollPane = new JScrollPane(tree);
            frame.add(scrollPane, BorderLayout.CENTER);
            frame.setSize(400, 500);
            frame.setVisible(true);
        });
    }
}

Alternatively, you can add the UnboundID LDAP SDK to the Classpath of your Java application.

Step #3 Test your application

You can run and test your LDAP Client as follows:

jbang ldaptree.java

Here is the LDAP Client in action:

Java LDAP Client tutorial

Conclusion

This article provided a step-by-step guide to connect to an LDAP Server from Java using a simple set of libraries available in UnboundID LDAP SDK for Java.

Was this article helpful? We need your support to keep MasterTheBoss alive!