Skip to content

A simplified interface for connecting to Active Directory in Java.

Notifications You must be signed in to change notification settings

agiles231/SimpleActiveDirectory4j

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Simple Active Directory For Java

Simplify connecting to Active Directory and use more standard data structures.

Example of searching AD using multithreading:

package some.package;

import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import javax.naming.NamingException;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;

import agiles231.AD.authentication.ActiveDirectoryAuthenticationMethods;
import agiles231.AD.authentication.Principal;
import agiles231.AD.naming.ActiveDirectoryName;
import agiles231.AD.search.ActiveDirectoryFilter;
import agiles231.AD.search.ActiveDirectoryFilterBuilder;

/***
 * The following may look familiar because it is a copy of the 
 * TestActiveDirectoryMultithread test.
 */
public class Example {
	public static void main(String[] args) throws InterruptedException, ExecutionException, NamingException {
		ActiveDirectoryContextProvider provider = new ActiveDirectoryContextProvider(Optional.empty());
		int numThreads = 2;
		String providerUrl = "ldaps://an-ad-controller.domain.com:636;
		String principalIn = "MrAdmin";
		String password = "password";
		String searchBase = "dc=domain,dc=com";
		String[] searchVals = {"[email protected]", "[email protected]"};
		Principal principal = new Principal(principalIn);
		List<ActiveDirectoryContext> contexts = new LinkedList<>();
		for (int i = 0; i < numThreads; i++) {
			contexts.add(provider.getActiveDirectoryContext(providerUrl, Optional.of(ActiveDirectoryAuthenticationMethods.SIMPLE)
				, principal, password));
		}

		List<Future<List<SearchResult>>> futures = new LinkedList<>();
		ExecutorService service = Executors.newFixedThreadPool(numThreads);
		for (int i = 0; i < numThreads; i++) {
			ActiveDirectoryContext context = contexts.get(i);
			futures.add(service.submit(new LookupUserTask(context, new ActiveDirectoryName(searchBase), searchVals[i])));
		}
		List<SearchResult> results = new LinkedList<>();
		for (Future<List<SearchResult>> future : futures) {
			while (!future.isDone()) {
				Thread.sleep(20l);
			}
			results.addAll(future.get());
		}
		for (SearchResult result : results) {
			System.out.println(result.getName());
		}
		service.shutdown();
	}
}
class LookupUserTask implements Callable<List<SearchResult>> {
	
	private final ActiveDirectoryContext context;
	private final ActiveDirectoryName name;
	private final String upn;
	public LookupUserTask(ActiveDirectoryContext context, ActiveDirectoryName name, String upn) {
		this.context = context;
		this.name = name;
		this.upn = upn;
	}

	@Override
	public List<SearchResult> call() throws Exception {
		ActiveDirectoryFilterBuilder builder = new ActiveDirectoryFilterBuilder();
		ActiveDirectoryFilter filter = builder.buildEqualsFilter("userPrincipalName", upn);
		SearchControls controls = new SearchControls();
		String returnedAtts[]={"sn","givenName", "samAccountName"};
		controls.setReturningAttributes(returnedAtts);
		controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
		List<SearchResult> results = context.search(name
				, filter, controls);
		return results;
	}
	
}

About

A simplified interface for connecting to Active Directory in Java.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages