`

JNDI访问LDAP

 
阅读更多

1.  搭建了ldap服务器

    - 下载openldap服务器软件(见附件):openldap-2.2.29-db-4.3.29-openssl-0.9.8a-win32_Setup.exe

    - 安装openldap,一路next就可以了。 默认安装位置:C:\Program Files\OpenLDAP

    - 修改C:\Program Files\OpenLDAP\slapd.conf里的内容

suffix  "dc=my-domain,dc=com"
rootdn  "cn=Manager,dc=my-domain,dc=com"
改成
suffix  "dc=it,dc=com"
rootdn  "cn=Manager,dc=it,dc=com"

    - 密码修改

修改C:\Program Files\OpenLDAP\slapd.conf里的内容: rootpw  secret
(可用简单模式,即明文密码如附件,也可用MD5方式加密)

MD5加密方式:
    C:\Program Files\OpenLDAP>slappasswd -h {MD5} -s secret
    {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==

将加密结果{MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==替换原有的简单密码,替换后slapd.conf文件为:
rootpw {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==

     - 修改C:\Program Files\OpenLDAP\slapd.conf文件

#
# LDAP Defaults
#

# See ldap.conf(5) for details
# This file should be world readable but not world writable.

BASE	dc=it, dc=com
#URI	ldap://ldap.example.com ldap://ldap-master.example.com:666

#SIZELIMIT	12
#TIMELIMIT	15
#DEREF		never

     配置参考附件中的ldap.conf和slapd.conf

    - 启动openldap服务

    C:\Program Files\OpenLDAP>slapd -d 1

 

2. 手动录入数据

第一步是要建立DN
# ldapadd -x -D 'cn=root,dc=it,dc=com' -W
dn: dc=it,dc=com
objectClass: dcObject
objectClass: organization
dc: it
o: Corporation
description: d Corporation
第二步是建立RDN:
# ldapadd -x -D 'cn=root,dc=it,dc=com' -W 
dn: uid=qq,dc=it,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
uid: qq
cn: qq
sn: qq
telephoneNumber: 138888888
description: openldap test
telexNumber: tex-8888888
street: my street
postOfficeBox: postofficebox
displayName: qqdisplay
homePhone: home1111111
mobile: mobile99999
mail:qq@qq.com

 

3. 数据录入--导入ldif文件
   C:\Program Files\OpenLDAP>ldapadd -x -D "cn=root,dc=it,dc=com" -W -f test.ldif
    test.ldif必须在LDAP安装目录下,即C:\Program Files\OpenLDAP

 

4. Java JNDI操作LDAP

    - 建立连接

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.ldap.LdapName;

public class LdapTest {
	public LdapTest() {
	}

	public static void main(String[] args) {
		String root = "dc=it,dc=com"; // root
		Hashtable env = new Hashtable();
		env.put(Context.INITIAL_CONTEXT_FACTORY,
				"com.sun.jndi.ldap.LdapCtxFactory");
		env.put(Context.PROVIDER_URL, "ldap://localhost/" + root);
		env.put(Context.SECURITY_AUTHENTICATION, "simple");
		env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,dc=it,dc=com");
		env.put(Context.SECURITY_CREDENTIALS, "secret");
		DirContext ctx = null;
		try {
			ctx = new InitialDirContext(env);
			System.out.println("认证成功");
		} catch (javax.naming.AuthenticationException e) {
			e.printStackTrace();
			System.out.println("认证失败");
		} catch (Exception e) {
			System.out.println("认证出错:");
			e.printStackTrace();
		}
		if (ctx != null) {
			try {
				ctx.close();
			} catch (NamingException e) {
				// ignore
			}
		}
		System.exit(0);
	}

}

    - 添加记录

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

public class JNDIAdd {
	public static void main(String args[]) {
		try {
			String root = "dc=it,dc=com"; // root
			Hashtable env = new Hashtable();
			env.put(Context.INITIAL_CONTEXT_FACTORY,
					"com.sun.jndi.ldap.LdapCtxFactory");
			env.put(Context.PROVIDER_URL, "ldap://localhost/" + root);
			env.put(Context.SECURITY_AUTHENTICATION, "simple");
			env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,dc=it,dc=com");
			env.put(Context.SECURITY_CREDENTIALS, "secret");

			// 添加方式1 直接绑定对象
			DirContext ctx = new InitialDirContext(env);
			Person p = new Person("mewilcox", "Mark");
			ctx.bind("cn=mnewilcox1", p);
			// end 添加方式1

			// 添加方式 2 绑定属性
			BasicAttributes attrs = new BasicAttributes();
			BasicAttribute objclassSet = new BasicAttribute("objectClass");
			// objclassSet.add("person");//可以省略
			// objclassSet.add("organizationalPerson");//可以省略
			objclassSet.add("inetOrgPerson");// 不可省略
			attrs.put(objclassSet);
			attrs.put("uid", "admin5");
			attrs.put("cn", "admin5");
			attrs.put("sn", "admin5");
			// 添加一个节点,createSubcontext方法的第一个属性的值是要修改的节点的不包含rootDN的DN
			ctx.createSubcontext("uid=admin5", attrs);
			// end 添加方式 2

			ctx.close();
		} catch (Exception e) {
			e.printStackTrace();
			System.exit(1);
		}
	}
}

    Person.java

import java.io.Serializable;
import java.rmi.Remote;
import java.util.Date;

//在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型
class Person implements Remote, Serializable {
	private static final long serialVersionUID = -8592182872966400365L;

	private String name;
	private String pass;

	public Person() {
	}

	public Person(String name, String pass) {
		this.name = name;
		this.pass = pass;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPass() {
		return pass;
	}

	public void setPass(String pass) {
		this.pass = pass;
	}

	public String toString() {
		return "name=" + this.getName() + "&pass=" + this.getPass();
	}

}

// 在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型
// 外部扩展,可以内部扩展也可以外部扩展
class RemoteDate extends Date implements Remote {
};

    - 查询记录

import java.util.Enumeration;
import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;

public class JNDISearch {

	// Initial context implementation
	public static String INITCTX = "com.sun.jndi.ldap.LdapCtxFactory";
	public static String MY_HOST = "ldap://localhost:389";
	public static String MY_SEARCHBASE = "dc=it,dc=com";
	public static String MY_FILTER = "(cn=*)";

	public static void main(String args[]) {
		try {

			Hashtable env = new Hashtable();

			// Specify which class to use for our JNDI provider
			env.put(Context.INITIAL_CONTEXT_FACTORY, INITCTX);
			// Specify host and port to use for directory service
			env.put(Context.PROVIDER_URL, MY_HOST);
			// Get a reference to a directory context
			DirContext ctx = new InitialDirContext(env);
			// Specify the scope of the search
			SearchControls constraints = new SearchControls();
			constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
			// Perform the actual search
			// We give it a searchbase, a filter and a the constraints
			// containing the scope of the search
			NamingEnumeration results = ctx.search(MY_SEARCHBASE, MY_FILTER,
					constraints);
			// Now step through the search results
			while (results != null && results.hasMore()) {
				SearchResult sr = (SearchResult) results.next();
				String dn = sr.getName();
				System.out.println("Distinguished   Name   is   " + dn);
				Attributes attrs = sr.getAttributes();
				for (NamingEnumeration ne = attrs.getAll(); ne
						.hasMoreElements();) {
					Attribute attr = (Attribute) ne.next();
					String attrID = attr.getID();
					System.out.println(attrID + ": ");
					for (Enumeration vals = attr.getAll(); vals
							.hasMoreElements();) {
						System.out.println("\t " + vals.nextElement());
					}
				}
				System.out.println("\n ");
			}
		} catch (Exception e) {
			e.printStackTrace();
			System.exit(1);
		}
	}
}

    - 删除记录

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

public class JNDIDel {

	// initial context implementation
	public static String INITCTX = "com.sun.jndi.ldap.LdapCtxFactory";
	public static String MY_HOST = "ldap://localhost:389/";
	public static String MGR_DN = "uid=Manager,dc=it,dc=com";
	public static String MGR_PW = "677992";
	public static String MY_SEARCHBASE = "dc=it,dc=com";
	public static String MY_ENTRY = "uid=qq1,dc=it,dc=com";
	public static void main(String args[]) {
		try {
			String root = "dc=it,dc=com"; // root
			Hashtable env = new Hashtable();
			env.put(Context.INITIAL_CONTEXT_FACTORY,
					"com.sun.jndi.ldap.LdapCtxFactory");
			env.put(Context.PROVIDER_URL, "ldap://localhost/");
			env.put(Context.SECURITY_AUTHENTICATION, "simple");
			env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,dc=it,dc=com");
			env.put(Context.SECURITY_CREDENTIALS, "secret");
			// Get a reference to a directory context
			DirContext ctx = new InitialDirContext(env);
			ctx.destroySubcontext(MY_ENTRY);
		} catch (Exception e) {
			e.printStackTrace();
			System.exit(1);
		}
	}
}
 

 

分享到:
评论
1 楼 zhuchao_ko 2012-03-09  
借鉴。

相关推荐

    com.sun.jndi.ldap.jar

    JNDI是一个接口,提供了一种标准的方式来访问命名和目录服务,而LDAP则是一种网络协议,常用于存储和查询用户账户、组信息、配置数据等结构化信息。 JNDI的主要作用是将Java应用程序与各种不同的命名和目录服务连接...

    jndi.zip_java ldap_jndi_jndi ldap_ldap_ldap java

    使用JNDI操作LDAP,首先需要创建一个初始上下文(Initial Context),这是访问 LDAP 服务器的入口点。然后,通过这个上下文执行各种操作,如查找(lookup)、绑定(bind)、重新绑定(rebind)、删除(unbind)和...

    封装JNDI的LDAP服务器的工具类

    在IT行业中,JNDI(Java Naming and Directory Interface)是一个标准接口,用于访问各种命名和目录服务,如LDAP(Lightweight Directory Access Protocol)。本篇内容将深入探讨如何封装JNDI操作,以便更方便地与...

    027-JNDI之初探 LDAP.pdf

    ### JNDI与LDAP基础概念 JNDI(Java Naming and Directory Interface)是Java平台的一部分,提供了一个标准API,用于访问命名和目录系统。它允许应用程序通过一个统一的接口进行对不同命名和目录服务的查找和访问...

    jndi之fsContext ldap

    提供了使用fsContext服务器的unbind bind list lookup rename的相关例子,及ldap 连接的一个例子 jndi,就是命名服务(n:naming)和目录服务(d:directory). 命名服务:把对象映射到方便记忆的名字的机制.可以通过域名系统...

    LDAPAccessUsingJNDI.pdf

    - **访问LDAP**:使用 JNDI 访问 LDAP 的主要步骤包括初始化上下文环境、建立连接、执行搜索以及处理结果。通过 JNDI 的 API,可以方便地执行 LDAP 操作,例如查询、插入、修改和删除记录。 - **存储对象**:可以...

    封装jndi操作ldap服务器的工具类

    【JNDI与LDAP简介】 Java Naming and Directory Interface (JNDI) 是Java平台中用于访问命名和目录服务的一组API。它为多种类型的命名和目录服务提供了统一的接口,包括 Lightweight Directory Access Protocol ...

    JNDI.J2SE.application.programming.examples.rar_java programming

    - **目录服务交互**:如何使用JNDI访问LDAP(轻量级目录访问协议)服务器,进行用户验证或数据查询。 5. **JNDI环境配置** - **jndi.properties**:配置JNDI的环境变量,如目录服务的位置和类型。 - **Java系统...

    CentOS上安装LDAP,Java访问LDAP数据。

    在本主题中,我们将详细探讨如何在CentOS操作系统上安装LDAP服务器,并利用Java编程语言来访问存储在LDAP中的数据。 首先,让我们详细了解一下在CentOS上安装和配置LDAP的过程: 1. **安装OpenLDAP**: 在CentOS...

    初学ldap和jndi

    通过上述介绍,我们了解到在Windows XP环境下安装和配置OpenLDAP的基本步骤,包括如何创建初始化数据、启动和测试LDAP服务器,以及如何使用JNDI API来编写Java程序访问LDAP服务器。这些知识点对于初学者来说非常实用...

    JNDI Java操作示例

    1. **adminName** 和 **adminPassword**:这是用于访问LDAP服务器的身份验证凭证。 2. **ldapURL**:指定LDAP服务器的地址,格式为`LDAP://IP:端口`。 3. **INITIAL_CONTEXT_FACTORY**:设置为`...

    基于SSL的ldap安全访问AD认证

    另一种是使用自定义的Socket Factory来访问LDAP目录。 在使用SSL证书保护LDAP通讯时,客户端需要提供包含SSL证书的密钥库的位置和密码。例如,在Java中,可以使用以下代码来设置LDAP环境: Hashtable env = new ...

    rmi-jndi-ldap-jrmp-jmx-jms:rmi,jndi,ldap,jrmp,jmx,jms一些演示测试

    在Java应用中,JNDI经常用来访问和操作LDAP目录服务。通过JNDI,开发者可以搜索、添加、删除和修改目录中的条目。 4. JRMP:JRMP是Java的默认远程方法调用协议,主要用于JVM间的通信。RMI系统使用JRMP来实现客户端...

    SpringLDAP和JNDI的增删改查

    JNDI是一个API,用于访问多种命名和目录服务。在Java应用中,JNDI常用来查找和绑定资源,如数据源、邮件服务器等。虽然JNDI本身并不提供具体的目录服务,但它提供了统一的接口来与各种目录服务通信。 ### LDAP操作...

    java对LDAP的增删改查

    JNDI 提供了一个统一的接口来访问不同的目录服务,包括 LDAP、DNS、NIS 等。通过 JNDI,开发者可以使用 Java 语言来访问和操作 LDAP 服务器。 在本文中,我们将讨论 Java 语言如何使用 JNDI 对 LDAP 服务器进行增删...

    Core.Java.Vol.2.Advanced.Features.8th.Edition.pdf

    同时,详细解释了如何使用JNDI访问LDAP(Lightweight Directory Access Protocol)目录服务,这对于构建企业级应用至关重要。 ### 6. Internationalization 为了适应全球化的软件开发需求,本书讲解了如何在Java...

Global site tag (gtag.js) - Google Analytics