用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();
}
10:33 | 永久链接 | 浏览 (1717) | 评论 (5) | 收藏 | ldap | 进入论坛 |
永久链接
http://junewolf.javaeye.com/blog/52090
评论 共 5 条 发表评论
Dustbin 2007-03-30 16:39
这样的程序会导致ldap服务器死机地,需要关闭ldap连接
Hejrcc 2007-06-14 21:05
呵呵, 就是。。。
Hejrcc 2007-06-14 21:10
看不出用JLDAP有什么优势, 我也刚刚开始学。
我写了个测试例子,请指点:
代码
public void testLdap() {
try {
DirContext context = getContext();
addEntry(context, "uid=oracle,ou=people,dc=mycompany,dc=com");
printEntry(context, "uid=oracle,ou=people,dc=mycompany,dc=com");
context.close();
} catch (AuthenticationException e) {
e.printStackTrace();
} catch (NamingException e) {
e.printStackTrace();
}
}
public DirContext getContext() throws NamingException {
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,dc=mycompany,dc=com");
env.put(Context.SECURITY_CREDENTIALS, "secret");
env.put(Context.SECURITY_AUTHENTICATION, "simple"); //"none", "simple", "strong"
DirContext initial = new InitialDirContext(env);
DirContext context = (DirContext) initial.lookup("ldap://localhost:389");
return context;
}
public void addEntry(DirContext context, String dn) throws NamingException {
Attributes attrs = new BasicAttributes();
attrs.put("uid", "oracle");
attrs.put("sn", "Lee");
attrs.put("cn", "Amy Lee");
attrs.put("telephoneNumber", "+1 408 555 0033");
attrs.put("userPassword", "redqueen".getBytes());
//the following attribute has two values
Attribute objclass = new BasicAttribute("objectClass");
objclass.add("uidObject");
objclass.add("person");
attrs.put(objclass);
context.createSubcontext(dn, attrs);
}
Hejrcc 2007-06-14 21:13
看见还有一种写法用来获取 DirContext, 下面的写法指定了 INITIAL_CONTEXT_FACTORY属性,我想知道我前面一种写法里面, env.put(Context.INITIAL_CONTEXT_FACTORY, ?);
这个INITIAL_CONTEXT_FACTORY 我没有设置, 不知道默认是什么?
代码
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:389");
env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,dc=mycompany,dc=com");
env.put(Context.SECURITY_CREDENTIALS, "secret");
//env.put(Context.SECURITY_AUTHENTICATION, "simple"); //"none", "simple", "strong"
DirContext context = new InitialDirContext(env);
用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();
10:27 | 永久链接 | 浏览 (1217) | 评论 (3) | 收藏 | ldap | 进入论坛 |
永久链接
http://junewolf.javaeye.com/blog/52088
评论 共 3 条 发表评论
Hejrcc 2007-06-14 21:20
我觉得楼主的代码很不好看啊,不要这么短就换行嘛。。。
还有, Indentation size = 4 就好了, 干嘛搞成8个字符这么宽啊,你这个代码, 第2行好像不用空字符吧?
代码
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/