流程:
1.用户调登录接口,传用户名和密码
2.用户名和密码在ad验证,验证通过后,返回当前用户的相关信息。(注:ldap为java自带的api不需要maven引入其他的)
3.根据返回的用户信息,实现自己系统的业务逻辑
package com.test;
import java.util.*;
import javax.naming.*;
import javax.naming.directory.*;
public class Test01 {
public static void main(String[] args) {
String username = "lisi@adtest.com";
String password = "acctId=acctId&bookId=bookID&catalogId=342781987884503040&companyId=342781985841876992";
//调用登陆接口
String name = login(username, password);
System.out.println(name);
}
private static String login(String username, String password) {
Hashtable env = new Hashtable();
//LDAP工厂类
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
//LDAP访问地址
env.put(Context.PROVIDER_URL, "ldap://192.168.177.128:389/dc=adtest,dc=com");
//账号密码
env.put(Context.SECURITY_PRINCIPAL, username);
env.put(Context.SECURITY_CREDENTIALS, password);
DirContext ctx;
String name="";
NamingEnumeration results = null;
try {
ctx = new InitialDirContext(env);
//搜索控制器
SearchControls controls = new SearchControls();
//建立搜索控制器
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
//根据设置的域节点、过滤器类和搜索控制器搜索LDAP获得结果
results = ctx.search("", "(&(objectclass=person)(userprincipalname=" + username + "))", controls);
SearchResult searchResult = (SearchResult) results.next();
Attributes attributes = searchResult.getAttributes();
//获取用户姓名
name = attributes.get("userprincipalname").get().toString().split("@")[0];
} catch (AuthenticationException e) {
String erroMsg= e.toString();
e.printStackTrace();
return erroMsg;
} catch (NameNotFoundException e) {
String erroMsg= e.toString();
e.printStackTrace();
return erroMsg;
} catch (NamingException e) {
e.printStackTrace();
String erroMsg= e.toString();
return erroMsg;
} finally {
if (results != null) {
try {
results.close();
} catch (Exception e) {
}
}
}
return name;
}
}
如果验证通过会返回用户信息,验证失败会报错。
微软ad域样子:(我是通过虚拟机安装了windos sever 2012 r2 然后在其系统上,安装了AD域)
安装AD域的步骤可以参照:https://www.cnblogs.com/wilburxu/p/9135313.html