用JAVA实现LDAP的访问

首先必须了解ldap,ldap相关可以问度娘。这边我重点要提的是dn(distinguished name),通俗的来说就是唯一标示。

然后现在可以先下一个ldapadmin,通过ldapadmin先连接已经配置好的ldap,下面是微软ad的图。

比如administrator这个用户的dn就是cn=administrator,cn=users,dc=ds-66,dc=com(简单来说就是全路径+域的形式)

最后就可以编码了,连接的代码比较简单,使用fliter的查询部门稍微复杂点,不过仔细看看也很容易理解,如下。

  1. public static void main(String[] args) {  
  2.     String url = "ldap://10.1.0.66:389/";  
  3.     String domain = "dc=ds-66,dc=com";  
  4.     String user = "cn=administrator,cn=users";  
  5.     String password = "111111";  
  6.     Hashtable<String, String> env = new Hashtable<String, String>();  
  7.     env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); // LDAP 工厂  
  8.     env.put(Context.SECURITY_AUTHENTICATION, "simple"); // LDAP访问安全级别  
  9.     env.put(Context.PROVIDER_URL, url);  
  10.     env.put(Context.SECURITY_PRINCIPAL, user+","+domain); //  填DN  
  11.     env.put(Context.SECURITY_CREDENTIALS, password); // AD Password  
  12.     env.put("java.naming.ldap.attributes.binary""objectSid objectGUID");  
  13.     LdapContext ldapCtx = null;  
  14.     try {  
  15.         ldapCtx = new InitialLdapContext(env , null);  
  16.         queryGroup(ldapCtx);  
  17.         //queryUser(ldapCtx);         
  18.           
  19.     } catch (NamingException e) {  
  20.         e.printStackTrace();  
  21.     } finally {  
  22.         if(ldapCtx != null) {  
  23.             try {  
  24.                 ldapCtx.close();  
  25.             } catch (NamingException e) {  
  26.             }  
  27.         }  
  28.     }  
  29. }  
  30.   
  31. private static void queryGroup(LdapContext ldapCtx) throws NamingException {  
  32.     SearchControls searchCtls = new SearchControls();  
  33.     searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);  
  34.     String searchFilter = "objectClass=organizationalUnit";  
  35.     String searchBase = "ou=myDeptSubDept,ou=myDept,dc=DS-66,dc=com";  
  36.     String returnedAtts[] = {"distinguishedName""objectGUID""name"};  
  37.     searchCtls.setReturningAttributes(returnedAtts);  
  38.     NamingEnumeration<SearchResult> answer = ldapCtx.search(searchBase, searchFilter, searchCtls);  
  39.     while (answer.hasMoreElements()) {  
  40.         SearchResult sr = answer.next();  
  41.         Attributes Attrs = sr.getAttributes();  
  42.         if (Attrs != null) {  
  43.             NamingEnumeration<?> ne = Attrs.getAll();  
  44.             while(ne.hasMore()) {  
  45.                 Attribute Attr = (Attribute)ne.next();  
  46.                 String name = Attr.getID();  
  47.                 Enumeration<?> values = Attr.getAll();  
  48.                 if (values != null) { // 迭代  
  49.                     while (values.hasMoreElements()) {  
  50.                         String value = "";  
  51.                         if("objectGUID".equals(name)) {  
  52.                             value = UUID.nameUUIDFromBytes((byte[]) values.nextElement()).toString();  
  53.                         } else {  
  54.                             value = (String)values.nextElement();  
  55.                         }  
  56.                         System.out.println(name + " " + value);  
  57.                     }  
  58.                 }  
  59.             }  
  60.             System.out.println("=====================");  
  61.         }  
  62.     }  
  63.       




用JAVA实现LDAP的访问(一)
关键字:   用JAVA实现LDAP的访问(一)    
 LDAP现在用的越来越多,所谓LDAP既Lightweight Directory Access Protocol。关于它的一些基本知识,我在这里就不做系统的介绍了,网上有很多的资料。我主要说一下在JAVA的语言环境中,怎样来操作LDAP。
    在这里,我推荐两个工具:LDAPTemplate和JLDAP。
    网上的资料比较少,而且不少都是E文的,可能英语不太好的朋友,就很难入门了。在这我把我的经验总结一下,和大家分享。
    LDAPTemplate是基于Spring1.2.7来开发的,其用法和Spring的JDBCTemplate差不多。最初,我是用这个开源的框架来对LDAP进行操作的,但是后来由于开发工具的转变,由eclipse转到了RAD上,而RAD所用的JDK却不支持Spring1.2.7(看来网上的谣传没错,IBM总在某个阴暗的角落在和SUN作对),没办法,只好另辟蹊径。后来发现了JLDAP,经过一番研究,发现它用起来并不比LDAPTemplate复杂,但在对象持久化方面需要自己去做,而LDAPTemplate通过AttributeMappers就可以把查询到的结果转换成POJO了。

用JAVA实现LDAP的访问(二)
关键字:   用JAVA实现LDAP的访问(二)    
 下面来具体的说一下怎么用JLDAP。首先要去下载一下JLDAP,具体下载的地址可以上网去搜。下载下来以后,lib里面的是开发所要用到的包,doc里面是帮助文档API和示例程序。
    先说说怎么查询,其实查询非常的简单,如果用过JDBC连数据库的话,那么连LDAP相比起来更加的简单。
    首先建立一个LDAPConnection对象。这个对象也可以通过连接池PoolManager来获得。LDAPConnection con = new LDAPConnection();然后运行connect方法和bind方法。连接上LDAP以后,就可以通过search方法来查找数据了。示例程序如下:
java 代码
LDAPConnection lc = new LDAPConnection();   
       try {   
           lc.connect("6.1.19.154",389);   
           lc.bind(LDAPConnection.LDAP_V3,"cn=xxx","xxxxxx");   
           LDAPSearchResults rs = lc.search("dc=excel,dc=com,dc=cn",LDAPConnection.SCOPE_SUB,"objectClass=*",null,false);   
           int count = 0;   
           while(rs.hasMore()){   
               LDAPEntry entry = rs.next();   
               System.out.println(entry.getDN());   
               count++;   
           }   
           System.out.println("共有"+count+"条记录。");   
       } catch (LDAPException e) {   
             
           System.err.print("连接异常!   ");   
           e.printStackTrace();   
       }  

 

用JAVA实现LDAP的访问(三)
关键字:   用JAVA实现LDAP的访问(三)    
  虽然LDAP主要是用来进行读操作的,但不可避免的,我们也要向其中添加一些新的数据。用JLDAP向LDAP服务器添加数据的操作也是非常简单的。
   为什么说非常简单呢,因为大体上也就是分三步。第一步,连接LDAP服务器。第二步,建立一个要添加的新的实体LDAPEntry,并添加相应的属性。第三步,通过add方法向LDAP中添加实体。
   首先说连接服务器。还是非常简单的三步:
java 代码
LDAPConnection con = new LDAPConnection();   
 con.connect("hostname",hostport);   
 con.bind("version","DN","password");  

连接后,可以建实体了,也就相当与为数据库添加一条新的记录。这里用到了几个类:LDAPEntry、LDAPAttribute和LDAPAttributeSet。首先建立一个LDAPAttributeSet,然后建立各种的LDAPAttribute,把他们add到LDAPAttributeSet中。然后建立一个LDAPEntry。其构造函数有两个参数,一个是这个LDAPEntry的DN,一个是他的属性集合,也就是LDAPAttributeSet。
   最后,调用LDAPConnection实例化对象的add方法,把实体添加到服务器中。然后别忘了断开连接喔。整体的示例代码如下:
java 代码
LDAPAttributeSet attributeSet = new LDAPAttributeSet();   
       attributeSet.add(new LDAPAttribute("objectclass", new String(   
               "inetOrgPerson")));   
       attributeSet.add(new LDAPAttribute("cn", new String[] { "李",   
               "Jim Smith", "Jimmy Smith" }));   
       attributeSet.add(new LDAPAttribute("givenname", new String[] { "测试",   
               "Jim", "Jimmy" }));   
       attributeSet.add(new LDAPAttribute("sn", new String("Smith")));   
       attributeSet.add(new LDAPAttribute("telephonenumber", new String(   
               "1 801 555 1212")));   
       attributeSet.add(new LDAPAttribute("mail",   
               new String("JSmith@Acme.com")));   
       attributeSet.add(new LDAPAttribute("userpassword", new String(   
               "newpassword")));   
       LDAPEntry entry = new LDAPEntry("cn=李,cn=Lizl,dc=excel,dc=com,dc=cn",   
               attributeSet);   
       LDAPConnection con = new LDAPConnection();   
       con.connect("6.1.19.154", 389);   
       con.bind(LDAPConnection.LDAP_V3, "cn=XXX", "XXXXXX");   
       con.add(entry);   
       System.out.println("成功的添加了一条记录!");   
       con.disconnect();   


 

用JAVA实现LDAP的访问(四)
关键字:   用JAVA实现LDAP的访问(四)    
这里来说一说怎么从LDAP中删除一个实体。
首先,连接LDAP服务器,然后通过DN来删除一个实体。
示例代码如下:
java 代码
LDAPConnection con = new LDAPConnection();   
con.connect("6.1.19.154",389);   
con.bind(LDAPConnection.LDAP_V3,"cn=XXXX","XXXXXX");   
con.delete("cn=JSmith,dc=excel,dc=com,dc=cn");   
System.out.println("成功删除一条记录!");   

ITDS的infoCenter的地址
关键字:   ITDS的infoCenter的地址    
ITDS的infoCenter的地址:
http://publib.boulder.ibm.com/infocenter/tivihelp/v2r1/index.jsp?toc=/com.ibm.IBMDS.doc/toc.xml
 
可以通过ITDS的WEB管理工具对LDAP进行管理,包括条目管理和objectclass以及
attributes的管理。
启动ITDS的WEB控制台的方法是打开cmd,
在D:\Program Files\IBM\LDAP\appsrv\bin文件夹下面(并不一定是这个路径,看安装时的位置,但\IBM\LDAP\appsrv\bin一般情况下不会变。)
输入startServer server1。
 
访问Web控制台的URL是:
http://6.1.9.54:9080/IDSWebApp/IDSjsp/IDSConsoleFrameWork.jsp

Ldap 的 Schema 中 的 objectclass 和 attributes 详解
关键字:   Ldap 的 Schema 中 的 objectclass 和 attributes 详解    
地址是:
http://www-03.ibm.com/servers/eserver/iseries/ldap/schema/


Java实现LDAP认证(上)
http://blog.csdn.net/lff0305/article/details/7611662



LDAP(Lightweight Directory Access Protocol)是一种应用层协议,用于访问和维护分布式目录信息服务。在Java中,可以使用JNDI(Java Naming and Directory Interface)API来访问LDAP服务。 下面是使用JNDI API实现LDAP添加数据的示例代码: ```java import javax.naming.*; import javax.naming.directory.*; public class LdapAddDataExample { public static void main(String[] args) { // 设置LDAP连接参数 String ldapUrl = "ldap://localhost:389"; String ldapUserDn = "cn=admin,dc=example,dc=com"; String ldapPassword = "password"; String ldapBaseDn = "ou=people,dc=example,dc=com"; // 创建LDAP连接 DirContext ctx = null; try { // 初始化环境 Hashtable<String, String> env = new Hashtable<String, String>(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, ldapUrl); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, ldapUserDn); env.put(Context.SECURITY_CREDENTIALS, ldapPassword); ctx = new InitialDirContext(env); // 创建LDAP条目 Attributes attrs = new BasicAttributes(); attrs.put("cn", "John Doe"); attrs.put("sn", "Doe"); attrs.put("givenName", "John"); attrs.put("mail", "john.doe@example.com"); attrs.put("userPassword", "password"); Attribute oc = new BasicAttribute("objectClass"); oc.add("inetOrgPerson"); attrs.put(oc); String entryDn = "cn=John Doe," + ldapBaseDn; ctx.createSubcontext(entryDn, attrs); System.out.println("LDAP条目添加成功!"); } catch (NamingException e) { e.printStackTrace(); } finally { if (ctx != null) { try { ctx.close(); } catch (NamingException e) { e.printStackTrace(); } } } } } ``` 在上面的代码中,首先设置了LDAP连接参数,然后创建了LDAP连接。接着,创建了LDAP条目的属性,并将其添加到指定的LDAP目录下。 需要注意的是,要使用JNDI API访问LDAP服务,需要在项目中引入javax.naming和javax.naming.directory包。同时,还需要在项目中引入LDAP服务器的JAR包,例如OpenLDAP的JAR包为:openldap.jar。 另外,需要根据实际情况修改代码中的LDAP连接参数和LDAP条目属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值