利用LDAP操作AD域

LDAP操作代码样例  初始化LDAP 目录服务上下文 
该例子中,我们使用uid=linly,ou=People,dc=jsoso,dc=net这个账号,链接位于本机8389端口的LDAP服务器(ldap://localhost:8389),认证方式采用simple类型,即用户名/密码方式。

private static void initialContext() throws NamingException{ 
   if(singleton == null){ 
    singleton = new LDAPConnection(); 
    /* 
    * 在实际编码中,这些环境变量应尽可能通过配置文件读取 
    */ 
    //LDAP服务地址 
    singleton.sLDAP_URL = "ldap://localhost:8389"; 
    //管理员账号 
    singleton.sMANAGER_DN = "uid=linly,ou=People,dc=jsoso,dc=net"; 
    //管理员密码 
    singleton.sMANAGER_PASSWORD = "coffee"; 
    //认证类型 
    singleton.sAUTH_TYPE = "simple"; 
    //JNDI Context工厂类 
    singleton.sCONTEXT_FACTORY = "com.sun.jndi.ldap.LdapCtxFactory"; 
   
    singleton.envProps.setProperty(Context.INITIAL_CONTEXT_FACTORY, singleton.sCONTEXT_FACTORY); 
    singleton.envProps.setProperty(Context.PROVIDER_URL, singleton.sLDAP_URL); 
    singleton.envProps.setProperty(Context.SECURITY_AUTHENTICATION, singleton.sAUTH_TYPE); 
    singleton.envProps.setProperty(Context.SECURITY_PRINCIPAL, singleton.sMANAGER_DN); 
    singleton.envProps.setProperty(Context.SECURITY_CREDENTIALS, singleton.sMANAGER_PASSWORD); 
    /* 
    * 绑定ldap服务器 
    */ 
    singleton.dirCtx = new InitialDirContext(singleton.envProps); 
   } 
}

通过一个Hashtable或者Properties对象为LDAP的Context设置参数,而后初始化InitialDirContext,即可绑定LDAP服务。这相当于JDBC中获取数据库的Connection对象。

绑定/创建LDAP条目对象
用户可以使用bind方法创建新的LDAP条目,下面的代码创建一个DN:"ou=Employee , dc=jsoso ,dc=net"的OrganizationUnit类LDAP条目如下:

public boolean createOrganizationUnit(){ 
   String ldapGroupDN = "ou=Employee , dc=jsoso ,dc=net"; 
   try { 
    /* 
    * 查找是否已经存在指定的OU条目 
    * 如果存在,则打印OU条目的属性信息 
    * 如果不存在,则程序会抛出NamingException异常,进入异常处理 
    */ 
    Attributes attrs = dirContext.getAttributes(ldapGroupDN); 
    System.out.println("Find the group , attributes list :"); 
    NamingEnumeration<String> nEnum = attrs.getIDs();   
    for( ; nEnum.hasMore() ; ){ 
     String attrID = nEnum.next(); 
     Attribute attr = (Attribute)attrs.get(attrID); 
     System.out.println(attr.toString()); 
    }   
    return false; 
   } catch (NamingException e) { 
    /* 
    * 没有找到对应的Group条目,新增Group条目 
    */ 
    //创建objectclass属性 
    Attribute objclass = new BasicAttribute("objectclass"); 
    objclass.add("top"); 
    objclass.add("organizationalunit"); 
    //创建cn属性 
    Attribute cn = new BasicAttribute("ou", "Employee"); 
    //创建Attributes,并添加objectclass和cn属性 
    Attributes attrs = new BasicAttributes(); 
    attrs.put(objclass); 
    attrs.put(cn); 
    //将属性绑定到新的条目上,创建该条目 
    try { 
     dirContext.bind(ldapGroupDN, null, attrs); 
     System.out.println("Group created successful"); 
     return true; 
    } catch (NamingException e1) { 
     e1.printStackTrace(); 
    }    
   } 
   return false; 
}

获取条目属性 
下面一段代码获取entryDN参数指定条目中的属性集合,并打印到控制台

/** 
* 获取一个指定的LDAP Entry 
* @param entryDN 
*/ 
public void find(String entryDN){ 
   try { 
    Attributes attrs = dirContext.getAttributes(entryDN); 
    if (attrs != null) { 
     NamingEnumeration<String> nEnum = attrs.getIDs(); 
     for( ; nEnum.hasMore() ; ){ 
      String attrID = nEnum.next(); 
      Attribute attr = (Attribute)attrs.get(attrID); 
      System.out.println(attr.toString()); 
     } 
     System.out.println(); 
    }else{ 
     System.out.println("No found binding."); 
    } 
   }catch(NamingException ne) { 
    ne.printStackTrace(); 
   } 
}

修改条目属性 
修改DN=user.getDistinguishedName()的条目中的cn、givenname、sn和userpassword四个属性值。 
(注:参数DirContext.REPLACE_ATTRIBUTE有另外两个常量:DirContext.ADD_ATTRIBUTE;DirContext.REMOVE_ATTRIBUTE,分别表示新增属性和删除属性。)

/** 
* 修改用户信息 
* @param user 
* @return 
* @throws Exception 
*/ 
public boolean modifyUser(LDAPUser user) throws Exception { 
   //用户对象为空 
   if (user == null) { 
    throw new Exception("No user information!n"); 
   }

//检查uid 
   String userDN = user.getDistinguishedName(); 
   if (userDN == null && userDN.length() == 0) { 
    throw new NamingException("No userDN you specify!n"); 
   }

//判断用户条目是否已经存在 
   if(!isUserexist(userDN)){ 
    return false; 
   } 
  
   //设置属性 
   Attributes attrs = new BasicAttributes(); 
   setBasicAttribute(attrs, "cn", user.getCommomName()); 
   setBasicAttribute(attrs, "givenname", user.getFirstName()); 
   setBasicAttribute(attrs, "sn", user.getLastName()); 
   setBasicAttribute(attrs, "userpassword", user.getPassword()); 
   //修改属性 
   try{ 
    dirContext.modifyAttributes(user.getDistinguishedName(),DirContext.REPLACE_ATTRIBUTE, attrs); 
    System.out.println("User(" + user.getDistinguishedName() + ") information modified.n"); 
    return true; 
   }catch(NamingException ne){ 
    ne.printStackTrace(); 
   } 
   return false; 
}

根据属性集搜索条目 
根据属性集matchingAttributes中的匹配值,在上下文DN= "ou=People,dc=jsoso ,dc=net"中搜索它的所有子树中的匹配条目。 
(注:SearchControls的SCOPE参数详见SearchControls SCOPE补充说明)

/** 
* 通过属性搜索LDAP范例 
* @return 
*/ 
public void searchByAttribute(Attributes matchingAttributes){ 
   String baseDN = "ou=People,dc=jsoso ,dc=net"; 
   SearchControls cons = new SearchControls(); 
   cons.setSearchScope(SearchControls.SUBTREE_SCOPE); 
   try { 
    Name baseName = new LdapName(baseDN); 
    NamingEnumeration<SearchResult> ne = dirContext.search(baseName, matchingAttributes); 
    SearchResult entry = null; 
    for(;ne.hasMore();){ 
     entry = ne.next(); 
     showEntry(entry); 
    }     
   } catch (NamingException e) { 
    e.printStackTrace(); 
   } 
}

根据过滤器搜索条目 
根据过滤器条件,在上下文DN = "ou=People,dc=jsoso ,dc=net"中,搜索它的所有子树中的匹配条目。 
(注:过滤器filter的相关语法详见LDAP filter语法补充说明)

/** 
* 通过过滤器搜索LDAP范例 
* @return 
*/ 
public void searchByFilter(String filter){ 
   String baseDN = "ou=People,dc=jsoso ,dc=net";   
   SearchControls cons = new SearchControls(); 
   cons.setSearchScope(SearchControls.SUBTREE_SCOPE); 
   try { 
    NamingEnumeration<SearchResult> ne = dirContext.search(baseDN, filter , cons); 
    SearchResult entry = null; 
    for(;ne.hasMore();){ 
     entry = ne.next(); 
     showEntry(entry); 
    }     
   } catch (NamingException e) { 
    e.printStackTrace(); 
   }

这里的内容是抄录别人的,自己写的没有别人写的这份全。这里的增加用户,增加组织单元,查找用户都经过了我的验证,没有问题。但是修改我没有验证通过。

删除没有做,但是从API上看,是没有问题的。 详细内容可以去百度文库搜:LDAP实用资料收录3.doc 。

该例子中,我们使用uid=linly,ou=People,dc=jsoso,dc=net这个账号,链接位于本机8389端口的LDAP服务器(ldap://localhost:8389),认证方式采用simple类型,即用户名/密码方式。

Java代码

1.   private static void initialContext() throws NamingException{

2.       if(singleton == null){

3.           singleton = new LDAPConnection();

4.           /*

5.            * 在实际编码中,这些环境变量应尽可能通过配置文件读取

6.            */

7.           //LDAP服务地址

8.           singleton.sLDAP_URL = "ldap://localhost:8389";

9.           //管理员账号

10.        singleton.sMANAGER_DN = "uid=linly,ou=People,dc=jsoso,dc=net";

11.        //管理员密码

12.        singleton.sMANAGER_PASSWORD = "coffee";

13.        //认证类型

14.        singleton.sAUTH_TYPE = "simple";

15.        //JNDI Context工厂类

16.        singleton.sCONTEXT_FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";

17.

18.        singleton.envProps.setProperty(Context.INITIAL_CONTEXT_FACTORY, singleton.sCONTEXT_FACTORY);

19.        singleton.envProps.setProperty(Context.PROVIDER_URL, singleton.sLDAP_URL);

20.        singleton.envProps.setProperty(Context.SECURITY_AUTHENTICATION, singleton.sAUTH_TYPE);

21.        singleton.envProps.setProperty(Context.SECURITY_PRINCIPAL, singleton.sMANAGER_DN);

22.        singleton.envProps.setProperty(Context.SECURITY_CREDENTIALS, singleton.sMANAGER_PASSWORD);

23.        /*

24.         * 绑定ldap服务器

25.         */

26.        singleton.dirCtx = new InitialDirContext(singleton.envProps);

27.    }

28.}

时间: 2024-11-11 21:08:01

利用LDAP操作AD域的相关文章

JAVA使用Ldap操作AD域

项目上遇到的需要在集成 操作域用户的信息的功能,第一次接触ad域,因为不了解而且网上其他介绍不明确,比较费时,这里记录下. 说明: (1). 特别注意:Java操作查询域用户信息获取到的数据和域管理员在电脑上操作查询的数据可能会存在差异(同一个意思的表示字段,两者可能不同). (2). 连接ad域有两个地址: ldap://XXXXX.com:389 和 ldap://XXXXX.com:636(SSL). (3). 端口389用于一般的连接,例如登录,查询等非密码操作,端口636安全性较高,用

Java使用LdAP获取AD域用户

随着我们的习大大上台后,国家在网络信息安全方面就有了很明显的改变!所以现在好多做网络信息安全产品的公司和需要网络信息安全的公司都会提到用AD域服务器来验证,这里就简单的研究了一下! 先简单的讲讲AD域和LdAP目录访问协议:AD(active directory)活动目录,动态的建立整个域模式网络中的对象的数据库或索引,协议为LDAP,安装了AD的服务器称为DC域控制器,存储整个域的对象的信息并周期性更新!其中的对象分为三大类--资源(如印表机).服务(如电子邮件).和人物(即帐户或用户,以及组

.net操作AD域

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Configuration;using System.DirectoryServices;namespace OperateADLibrary{    public class OperateAD    {        /// <summary>        /// 域名        /// <

关于Ldap对AD域账户的增删改查

今天心情很不爽,那啥也不懂的老板,又来直接修改了我的需求,还很自信的对我们研发人员说:"他这产品经理已经做得很好了!",在这里我回复一句,以我这么多年的经验,做得跟一条狗似的,还自我感觉良好!!!好啦,不扯别的啦,来讲讲Ldap对AD域账户的操作吧!至于Ldap和ad今天就不做详细解释了,有兴趣的朋友可以看看上一篇博文,里面有详细的介绍!直接上代码: /** * @Description: * * @Title: LdapByUser.java * @Package com.joyce

Ubuntu通过LDAP集成AD域账号登录(libnss-ldap方式)

Ubuntu通过LDAP集成AD域账号登录(libnss-ldap方式): # apt-get install libnss-ldap   (中间直接回车,忽略) # vi /etc/nsswitch.conf passwd: files ldap group:  files ldap shadow: files ldap :wq # vi /etc/ldap.conf base dc=ming,dc=com uri ldap://10.0.0.2 binddn cn=ldapadmin,cn=

Java利用jcifs集成AD域用户认证

最近一段时间发现AD这东西老火了,尤其是涉及到安全这一方面的,所以AD域用户认证成了现在网络安全方面的产品必备!这里就简单的分享一下,Java通过jcifs集成AD域用户实现认证,以实现网络安全! 我们通过一个demo来看看jcifs实现SSO,SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一 个用户的登录的机制.它是目前比较流行的企业业务整合的解决方案之一. 第

CentOS 6通过ldap集成AD域账号(nslcd方式)

CentOS 6通过ldap集成AD域账号(nslcd方式): CentOS 6默认有安装nss-pam-ldapd软件(rpm -qa nss-pam-ldapd,rpm -ql nss-pam-ldapd) vi /etc/nsswitch.conf passwd: files ldapgroup: files ldapshadow: files ldap:wq vi /etc/nslcd.conf binddn cn=aa,cn=users,dc=ming,dc=com (aa为普通AD账

实验记录贴 —— 账号同步实验 RTX 和 LDAP(AD域)

目前,公司有多个系统,RTX,邮箱(MD),OA,NC. 这些系统之间,如果要实现单点登录的话,账户肯定需要同步,或者某一种映射机制. 如果所有数据都和中央账号数据库(LDAP,这里是AD域)看齐,那就可以省去很多麻烦.即使做映射,那么仅仅根据用户名也可以实现这样的功能.不过单点登录还是需要额外的代码,最好是架设一个cas服务器. ———————————————————————————— 邮箱MD的工具比较丰富,可以直接在服务器工具端,设置和ad的轮询次数和时间间隔.自动进行账号密码同步. 而R

JAVA 通过LDAP获取AD域用户及组织信息

因为工作需求近期做过一个从客户AD域获取数据实现单点登录的功能,在此整理分享. 前提:用户可能有很多系统的情况下,为了方便账号的统一管理使用AD域验证登录,所以不需要我们的系统登录,就需要获取用户的AD域组织和用户信息,实现域认证和单点登录. LDAP: LDAP是轻量目录访问协议 AD域:微软基于域模式的集中化管理 1.常规的AD域登陆验证 LdapContext dc = null;             Hashtable<String, String> env = new Hasht