public class LDAPHelper {
/**
* LDAP可以理解為一個多級目錄,這里,表示要連接到那個具體的目錄
*/
private final String baseDn = "ou=People,dc=changyeyi,dc=com";
private LdapContext ctx = null;
private final Control[] connCtls = null;
private void connect() {
Hashtable env = new Hashtable<>();
String factory = "com.sun.jndi.ldap.LdapCtxFactory";
env.put(Context.INITIAL_CONTEXT_FACTORY, factory);
String url = "ldap://192.168.31.178:389/";
env.put(Context.PROVIDER_URL, url + baseDn);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
String root = "cn=admin,dc=changyeyi,dc=com";
//管理員dn
env.put(Context.SECURITY_PRINCIPAL, root);
// 管理員密碼
env.put(Context.SECURITY_CREDENTIALS, "123456");
try {
ctx = new InitialLdapContext(env, connCtls);
System.out.println( "連接成功" );
} catch (javax.naming.AuthenticationException e) {
System.out.println("連接失敗:");
e.printStackTrace();
} catch (Exception e) {
System.out.println("連接出錯:");
e.printStackTrace();
}
}
private void closeContext(){
if (ctx != null) {
try {
ctx.close();
}
catch (NamingException e) {
e.printStackTrace();
}
}
}
/**
* dn就是目標名字+當前目錄名字
*/
private String getUserDN(String uid) {
String userDN = "";
connect();
try {
SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
//第一個參數是從哪個目錄下開始查,因為連接的url里已經指定了ou=People,dc=gosun,dc=com,所以這里填""即可
//第二個參數是查詢條件,uid、email等,都是ldap中存放的參數
NamingEnumeration en = ctx.search("", "uid=" + uid, constraints);
if (en == null || !en.hasMoreElements()) {
System.out.println("未找到該用戶");
}
while (en != null && en.hasMoreElements()) {
SearchResult obj = en.nextElement();
if (obj != null) {
SearchResult si = obj;
userDN += si.getName();
userDN += "," + baseDn;
} else {
System.out.println((Object) null);
}
}
} catch (Exception e) {
System.out.println("查找用戶時產生異常。");
e.printStackTrace();
}
return userDN;
}
/**
* 通過uid獲取dn,然后連接驗證
*/
public boolean authentication(String uid, String password) {
boolean valide = false;
String userDN = getUserDN(uid);
try {
ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN);
ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password);
ctx.reconnect(connCtls);
System.out.println(userDN + " 驗證通過");
valide = true;
} catch (AuthenticationException e) {
System.out.println(userDN + " 驗證失敗");
System.out.println(e.toString());
} catch (NamingException e) {
System.out.println(userDN + " 驗證失敗");
}
closeContext();
return valide;
}
public boolean addUser(String usr, String pwd,String uid,String description) {
try {
connect();
BasicAttributes attrsbu = new BasicAttributes();
BasicAttribute objclassSet = new BasicAttribute("objectclass");
objclassSet.add("inetOrgPerson");
attrsbu.put(objclassSet);
attrsbu.put("sn", usr);
attrsbu.put("cn", usr);
attrsbu.put("uid", uid);
attrsbu.put("userPassword", pwd);
attrsbu.put("description", description);
//這里指定目錄名字,可以用uid=/cn=,如uid=changyeyi,或者cn=yaoji
ctx.createSubcontext("uid="+uid+"", attrsbu);
return true;
} catch (NamingException ex) {
ex.printStackTrace();
}
closeContext();
return false;
}
public static void main(String[] args) {
LDAPHelper ldap = new LDAPHelper();
/**
* 用戶認證
*/
/*if(ldap.authentication("changyeyi", "changyeyi")){
System.out.println( "該用戶認證成功" );
}*/
/**
* 用戶添加
*/
ldap.addUser("emma","emma","emma_uid","測試");
}
}