I am currently working on a plugin that needs to receive some information from an LDAP/Active Directory using JNDI. That’s why I needed to set up a directory server in a short time and I didn’t want to waste much effort for here. Luckily for me the Apache Directory Studio saved my day and allowed me to set up everything I needed in a few minutes.

ldap tutorial teaser

Short and sweet: In this tutorial I’m going to show you how to configure everything you need in your Eclipse IDE and finally how to query the created LDAP server with a tiny java client using JNDI.

Prerequisites

You’ll need Java, Eclipse and that’s all ..

Apache Directory Studio Setup

First we’re going to install Apache Directory Studio as Eclipse Plugin ..

Install Eclipse Plugin

  • Install the plugin using the update site http://directory.apache.org/studio/update/2.x

  • You should at least install Apache Directory Studio Apache DS, Apache Directory Studio LDAP Browser and Apache Directory Studio LDIF Editor here .. or just install everything .. it won’t hurt ..

  • If you’re totally unfamiliar with installing a plugin in Eclipse, there is a detailed installation guide for you on the Apache Directory Studio Website.

eclipse installation
Figure 1. Apache DS Eclipse Plugin Installation

Create a new LDAP server

Now we want to create a new LDAP server for development ..

  • Open the server view by going: Menubar > Window > Show View > Other > Apache DS > Servers

servers view
Figure 2. Creating a new LDAP server in Eclipse IDE
  • Rightclick in the server view and select New > New server

  • Enter a name for the server e.g. “ldap-devel” and finish

  • You should see your new created server in the server view

  • Start your LDAP server by rightclick and run .. after a short time the server’s status should have changed to “started”

server started
Figure 3. Viewing the LDAP server status in Eclipse
  • If you take a look at the server’s current configuration you’ll see that the server is configured for the host name ldap.example.com

Creating a connection to the server

We need a connection for the following data import and to query our directory server

  • Just right-click on the server in the server view and select LDAP-Browser > Create a connection and let the IDE switch to the LDAP Perspective

  • In the LDAP perspective there’s the LDAP Browser, an outline for the directory structure, the connection and server views and the directory logs

Import sample data from a LDIF file

Now we need some data in our directory server – we do not query him for fun! ;)

  • We’re going to import some data from an LDIF file .. just copy the following content and save it to a file and open it in the perspectiv. It is important that the last line in the LDIF file is an empty line/newline.

    dn: dc=example,dc=com
    objectClass: domain
    objectClass: top
    dc: example
    
    dn: ou=Users,dc=example,dc=com
    objectClass: organizationalUnit
    objectClass: top
    ou: Users
    
    dn: ou=Groups,dc=example,dc=com
    objectClass: organizationalUnit
    objectClass: top
    ou: Groups
    
    dn: cn=Micha Kops,ou=Users,dc=example,dc=com
    objectClass: inetOrgPerson
    objectClass: organizationalPerson
    objectClass: person
    objectClass: top
    cn: Micha Kops
    sn: Kops
    uid: mkops
    userPassword:: abcdefg
    
    dn: cn=Santa Claus,ou=Users,dc=example,dc=com
    objectClass: inetOrgPerson
    objectClass: organizationalPerson
    objectClass: person
    objectClass: top
    cn: Santa Claus
    sn: Claus
    uid: sclaus
    userPassword:: abcdefg
    
    dn: cn=John Steinbeck,ou=Users,dc=example,dc=com
    objectClass: inetOrgPerson
    objectClass: organizationalPerson
    objectClass: person
    objectClass: top
    cn: John Steinbeck
    sn: Steinbeck
    uid: jsteinbeck
    userPassword:: abcdefg
  • In the editor click on Browse and select your current connection

  • Then click on Execute LDIF – now we’ve got some more content in our directory and you are able to see it in the _Outline view
    _

Connecting to the LDAP server in Eclipse

connection select

The imported data in the LDAP outline view

ldap outline

Querying in the LDAP perspective

Now lets run a sample query for all users using the LDAP Browser’s search feature: Click on Searches > New > New Search …

Querying the LDAP server

ldap search 1024x586

Viewing the result of the LDAP query in Eclipse

ldap search result

Running a query using Java and JNDI

Now we want to query the directory for existing user using JNDI .. and our program should output

  • I’ve created a simple new Java project in Eclipse containing this one class named LdapQuery

    package com.hascode.tutorial.ldap;
    
    import java.util.Hashtable;
    
    import javax.naming.Context;
    import javax.naming.NamingEnumeration;
    import javax.naming.NamingException;
    import javax.naming.directory.Attributes;
    import javax.naming.directory.DirContext;
    import javax.naming.directory.InitialDirContext;
    import javax.naming.directory.SearchControls;
    import javax.naming.directory.SearchResult;
    
    public class LdapQuery {
    	public static void main(String[] args) throws NamingException {
    		Hashtable<String, String> env = new Hashtable<String, String>();
    		env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    		env.put(Context.PROVIDER_URL, "ldap://127.0.0.1:10389/");
    		env.put(Context.SECURITY_AUTHENTICATION, "simple");
    		env.put(Context.SECURITY_PRINCIPAL, "uid=admin,ou=system");
    		env.put(Context.SECURITY_CREDENTIALS, "secret");
    		DirContext ctx = new InitialDirContext(env);
    
    		SearchControls searchControls = new SearchControls();
    		searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
    		NamingEnumeration<SearchResult> enumeration = ctx.search("ou=Users,dc=example,dc=com", "(objectClass=person)", searchControls);
    		while (enumeration.hasMore()) {
    			SearchResult result = enumeration.next();
    			Attributes attrs = result.getAttributes();
    			System.out.println(String.format("User found.. %s, %s", attrs.get("cn"), attrs.get("uid")));
    		}
    	}
    }
  • Run the class and you should see the following output

    User found.. cn: Micha Kops, uid: mkops
    User found.. cn: Santa Claus, uid: sclaus
    User found.. cn: John Steinbeck, uid: jsteinbeck

Tutorial Sources Download

I have put the source from this tutorial on my GitHub repository – download it there or check it out using Mercurial:

git clone https://github.com/hascode/hascode-tutorials.git

LDAP Testing with Java

I have written another article covering the topic of writing integration tests for LDAP connected applications, please feel free to read: “LDAP Testing with Java: ApacheDS vs Embedded-LDAP-JUnit“.

Article Updates

  • 2015-03-30: Formatting fixed, image captions added.

  • 2016-07-04: Link to LDAP testing tutorial added.