LDAP Authentication Using Java(JNDI)
For authenticating any user with credentials from Active Directory , we can use LDAP (Lightweight Directory Access Protocol).
Below is a simple Java class which contains authenticateUser() method which can be invoked and the user can be authenticated with Active Directory.
import java.util.Enumeration;
import java.util.Hashtable;
import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
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;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
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 LdapProvider {
private static final String auth_method = "simple";
// set the LDAP client Version
private static final String ldap_version = "3";
// This is our LDAP Server's IP
private static final String ldap_host = "10.10.10.10"; //change this as per yours // This is our LDAP Server's Port
private static final String ldap_port = "389";
// This is our base DN
private static final String base_dn = "DC=exchange2k7,DC=com"; // //change this as per yours
public boolean authenticateUser(String userId,String password){
boolean isValidUser = false;
String ldap_dn = "cn="+userId+",cn=Users,"+ base_dn ;
DirContext ctx = null;
Hashtable<String, String> env = new Hashtable<String, String>();
private static final String auth_method = "simple";
// set the LDAP client Version
private static final String ldap_version = "3";
// This is our LDAP Server's IP
private static final String ldap_host = "10.10.10.10"; //change this as per yours // This is our LDAP Server's Port
private static final String ldap_port = "389";
// This is our base DN
private static final String base_dn = "DC=exchange2k7,DC=com"; // //change this as per yours
public boolean authenticateUser(String userId,String password){
boolean isValidUser = false;
String ldap_dn = "cn="+userId+",cn=Users,"+ base_dn ;
DirContext ctx = null;
Hashtable<String, String> env = new Hashtable<String, String>();
// Here we store the returned LDAP object data
String dn = "";
// This will hold the returned attribute list
Attributes attrs;
String dn = "";
// This will hold the returned attribute list
Attributes attrs;
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL,"ldap://" + ldap_host + ":" + ldap_port);
env.put(Context.SECURITY_AUTHENTICATION, auth_method);
env.put(Context.SECURITY_PRINCIPAL, ldap_dn);
env.put(Context.SECURITY_CREDENTIALS, password);
env.put("java.naming.ldap.version", ldap_version);
try{
System.out.println("Connecting to host " + ldap_host + " at port " + ldap_port + "...");
System.out.println();
env.put(Context.PROVIDER_URL,"ldap://" + ldap_host + ":" + ldap_port);
env.put(Context.SECURITY_AUTHENTICATION, auth_method);
env.put(Context.SECURITY_PRINCIPAL, ldap_dn);
env.put(Context.SECURITY_CREDENTIALS, password);
env.put("java.naming.ldap.version", ldap_version);
try{
System.out.println("Connecting to host " + ldap_host + " at port " + ldap_port + "...");
System.out.println();
ctx = new InitialDirContext(env);
System.out.println("LDAP authentication successful!");
System.out.println("LDAP authentication successful!");
// Specify the attribute list to be returned
String[] attrIDs = { "memberOf" };
String[] attrIDs = { "memberOf" };
SearchControls ctls = new SearchControls();
ctls.setReturningAttributes(attrIDs);
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
ctls.setReturningAttributes(attrIDs);
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
// Specify the search filter to match
String filter = "(&(objectClass=user)(sAMAccountName="+userId+"))";
String filter = "(&(objectClass=user)(sAMAccountName="+userId+"))";
// Search the subtree for objects using the given filter
NamingEnumeration<SearchResult> answer = ctx.search(base_dn, filter, ctls);
NamingEnumeration<SearchResult> answer = ctx.search(base_dn, filter, ctls);
// Print the answer
//Search.printSearchEnumeration(answer);
//Search.printSearchEnumeration(answer);
while (answer.hasMoreElements()) {
isValidUser = true;
SearchResult sr = (SearchResult)answer.next();
dn = sr.getName();
attrs = sr.getAttributes();
isValidUser = true;
SearchResult sr = (SearchResult)answer.next();
dn = sr.getName();
attrs = sr.getAttributes();
System.out.println("Found Object: " + dn + "," + base_dn);
if (attrs != null) {
// we have some attributes for this object
NamingEnumeration ae = attrs.getAll();
while (ae.hasMoreElements()) {
Attribute attr = (Attribute)ae.next();
String attrId = attr.getID();
System.out.println("Found Attribute: " + attrId);
Enumeration vals = attr.getAll();
while (vals.hasMoreElements()) {
String attr_val = (String)vals.nextElement();
System.out.println(attrId + ": " + attr_val);
}
}
}
}
// Close the context when we're done
ctx.close();
} catch (AuthenticationException authEx) {
authEx.printStackTrace();
System.out.println("LDAP authentication failed!");
} catch (NamingException namEx) {
System.out.println("LDAP connection failed!");
namEx.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return isValidUser;
}
}
if (attrs != null) {
// we have some attributes for this object
NamingEnumeration ae = attrs.getAll();
while (ae.hasMoreElements()) {
Attribute attr = (Attribute)ae.next();
String attrId = attr.getID();
System.out.println("Found Attribute: " + attrId);
Enumeration vals = attr.getAll();
while (vals.hasMoreElements()) {
String attr_val = (String)vals.nextElement();
System.out.println(attrId + ": " + attr_val);
}
}
}
}
// Close the context when we're done
ctx.close();
} catch (AuthenticationException authEx) {
authEx.printStackTrace();
System.out.println("LDAP authentication failed!");
} catch (NamingException namEx) {
System.out.println("LDAP connection failed!");
namEx.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return isValidUser;
}
}
Above class can directly be used and authenticateUser() method can be invoked after creating an instance of LdapProvider class.
Feel free to contact me in case getting any issues.