JAVA中使用LDAP登录的三种方式

时间:2021-06-09 16:12:26

搜索中关于java 登录ldap,大部分会采用  cn=xxx,ou=xxx,dc=xxx的方式,此处的cn是用户的Display Name,而不是account,而且如果ou有多层,比如我们的OU就会超过三层。

那最好是通过用户的account直接登录

代码如下:

    /**
* 获取默认LDAP连接
* Exception 则登录失败,ctx不为空则登录成功
* @return void
*/
public static LdapContext getLDAPConnection() throws AuthenticationException, CommunicationException,Exception {
LdapContext ctx = null; //LDAP 连接地址 ldap://IP:PORT (default port 389)
String LDAP_URL = ""; //LDAP SSL连接地址 ldaps://IP:PORT (default port 636)
//(这个用起来比较麻烦,目前知道管理员改密码必须使用SSL)
String LDAP_SSL_URL = ""; //用户名
String userAccount = ""; //管理员密码
String userPassword = ""; // 方式1
// 基于姓名(cn),此cn为Display Name,部门有同名就麻烦了
userAccount = "cn=xxx,OU=xxx,DC=xxx,DC=com"; // 方式2
// 基于Account User Logon name:
// userAccount = "xxx@domain.xxx"; // 方式3
// 基于Account User Logon name(pre-windows 2000):
// userAccount = "domain\\xxx" // 基于登录名(uid (User ID)与 unix 的 uid 完全不同)(请注意objectSID,此处尝试失败)
// uid=abc123, ou=xxxx, dc=xxxx, dc=com userPassword = "xxxxx";
Hashtable<String,String> HashEnv = new Hashtable<String,String>();
HashEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); // LDAP访问安全级别(none,simple,strong)
HashEnv.put(Context.SECURITY_PRINCIPAL, userAccount); //AD的用户名
HashEnv.put(Context.SECURITY_CREDENTIALS, userPassword); //AD的密码
HashEnv.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); // LDAP工厂类
HashEnv.put("com.sun.jndi.ldap.connect.timeout", "3000");//连接超时设置为3秒
HashEnv.put(Context.PROVIDER_URL, LDAP_URL); ctx = new InitialLdapContext(HashEnv, null);//new InitialDirContext(HashEnv);// 初始化上下文 return ctx;
}

参考:Java ldap服务器的连接和修改密码