程序员

Java 中 LDAP 的使用与整理

2018-01-10  本文已影响2888人  58bc06151329

文前说明

作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。

本文仅供学习交流使用,侵权必删。
不用于商业目的,转载请注明出处。

LDAP 是轻量 目录访问协议,英文全称是 Lightweight Directory Access Protocol,一般都简称为 LDAP。LDAP 基于 X.500 标准的,但简单了许多并且可以根据需要进行定制。与 X.500 不同,LDAP 支持 TCP/IP。LDAP 的核心规范在 RFC 中都有定义,所有与 LDAP 相关的RFC 都可以在 LDAPman RFC 网页中找到。

目录结构

组织数据

单独记录

基于登录名(uid (User ID)与 unix 的 uid 完全不同)

uid=abc123, ou=xxxx, dc=xxxx, dc=com

基于姓名(cn)

cn=abc, ou=xxxx, dc=xxxx, dc=com

定制对象

属性名称 含义 备注
OU Organizational Unit(组织单元) 最多可以有四级,每级最长 32 个字符,可以为中文。
DC Domain Component(域名) dc=xxxx,dc=com
CN Common Name(用户名或服务器名) 最长可以到 80 个字符,可以为中文。
O Organization(组织名称) 可以 3~64 个字符长度。
C Country(国家名) 可选,为 2 个字符长度。
SN
UID 用户ID
DN 唯一标识 类似于 Linux 文件系统的绝对路径,每个对象都有一个唯一的名称。

Java 中 LDAP 的基本操作

LDAP 连接
Hashtable env = new Hashtable();
String LDAP_URL = "ldap://<IP>:389"; // LDAP 访问地址
String adminName = "example\\user"; // 注意用户名的写法:domain\User 或 cn=user
String adminPassword = "userpassword"; // 密码
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, LDAP_URL);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, adminName);
env.put(Context.SECURITY_CREDENTIALS, adminPassword);
try {
     dc = new InitialDirContext(env);// 初始化上下文
     System.out.println("认证成功");
} catch (javax.naming.AuthenticationException e) {
     System.out.println("认证失败");
} catch (Exception e) {
     System.out.println("认证出错:" + e);
}
LDAP 增加记录
String root = "dc=example,dc=com"; // LDAP的根节点的DC

BasicAttributes attrs = new BasicAttributes();
BasicAttribute objclassSet = new BasicAttribute("objectClass");
objclassSet.add("sAMAccountName");
objclassSet.add("employeeID");
objclassSet.add("sAMAccountName");
objclassSet.add("employeeID");
attrs.put(objclassSet);
attrs.put("ou", newUserName);
dc.createSubcontext("ou=" + newUserName + "," + root, attrs);
LDAP 删除记录
try {
     dc.destroySubcontext(dn);
} catch (Exception e) {
     e.printStackTrace();
     System.out.println("Exception in delete():" + e);
}
LDAP 重命名节点
try {
      dc.rename(oldDN, newDN);
      return true;
} catch (NamingException ne) {
      System.err.println("Error: " + ne.getMessage());
      return false;
}
LDAP 修改
try {
      ModificationItem[] mods = new ModificationItem[1];
      /* 修改属性 */
      // Attribute attr0 = new BasicAttribute("employeeID", "test");
      // mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attr0);
      /* 删除属性 */
      // Attribute attr0 = new BasicAttribute("description", "test");
      // mods[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, attr0);
      /* 添加属性 */
      Attribute attr0 = new BasicAttribute("employeeID", employeeID);
      mods[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE, attr0);
      /* 修改 */
      dc.modifyAttributes(dn + ",dc=example,dc=com", mods);
      return true;
} catch (NamingException e) {
      e.printStackTrace();
      System.err.println("Error: " + e.getMessage());
      return false;
}
LDAP 查询
// 创建搜索控件
SearchControls searchCtls = new SearchControls();
// 设置搜索范围
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
// 设置搜索过滤条件
String searchFilter = "sAMAccountName=" + userName;
// 设置搜索域节点
String searchBase = "DC=example,DC=COM";
// 定制返回属性
String returnedAtts[] = { "url", "whenChanged", "employeeID", "name", "userPrincipalName", "physicalDeliveryOfficeName", "departmentNumber", "telephoneNumber", "homePhone", "mobile", "department", "sAMAccountName", "whenChanged", "mail" };
// 不定制属性,返回所有的属性集
// searchCtls.setReturningAttributes(null);
int totalResults = 0;
try {
     NamingEnumeration answer = dc.search(searchBase, searchFilter, searchCtls);
     while (answer.hasMoreElements()) {
           SearchResult sr = (SearchResult) answer.next();
           Attributes Attrs = sr.getAttributes();
           if (Attrs != null) {
                 try {
                        for (NamingEnumeration ne = Attrs.getAll(); ne.hasMore();) {
                                Attribute Attr = (Attribute) ne.next();
                                // 读取属性值
                                for (NamingEnumeration e = Attr.getAll(); e.hasMore(); totalResults++) {
                                         // 接受循环遍历读取的userPrincipalName用户属性
                                         String user = e.next().toString();
                                }
                                // 读取属性值
                                // Enumeration values = Attr.getAll();
                                // if (values != null) {
                                //          while (values.hasMoreElements()) {
                                //                   System.out.println(" 2AttributeValues=" + values.nextElement());
                                //          }
                                // }
                        }
                 } catch (NamingException e) {
                        System.err.println("Throw Exception : " + e);
                 }
           }
     }
} catch (Exception e) {
      e.printStackTrace();
      System.err.println("Throw Exception : " + e);
}
LDAP 关闭
if (dc != null) {
     try {
         dc.close();
     } catch (NamingException e) {
         System.out.println("NamingException in close():" + e);
     }
}
上一篇下一篇

猜你喜欢

热点阅读