一 、什么是LDAP
LDAP:(轻量级目录访问协议,Lightweight Directory AccessProtocol)
它是基于 X.500标准的,但是简单多了并且可以根据需要定制。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的。
目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它成树状结构组织数据,就好象Linux/Unix系统中的文件目录一样。目录数据库和关系数据 库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,数据修改使用简单的锁定机制实现All-or-Nothing,不适于存储修 改频繁的数据。所以目录天生是用来查询的,就好象它的名字一样。现在国际上的目录服务标准有两个,一个是较早的X.500标准,一个是较新的LDAP标 准。 LDAP诞生的目标是快速响应和大容量查询并且提供多目录服务器的信息复制功能,它为读密集型的操作进行专门的 优化。因此,当从LDAP服务器中读取数据的时候会比从专门为OLTP优化的关系型数据库中读取数据快一个数量级。
LDAP常用术语解释: DN:distinguished name。在LDAP目录中的所有记录项都有一个唯一的DN CN,OU,DC都是LDAP连接服务器的端字 符串中的区别名称; LDAP连接服务器的连接字串格式为:ldap://servername/DN 其中DN有三个属性,分别是CN,OU,DC LDAP是一种通讯协议,如同HTTP是一种协议一样的!在LDAP目录中。 uid (User ID) CN (Common Name) DC (Domain Component) 域名元素 OU (Organizational Unit) SN (surname) An LDAP 目录类似于文件系统目录. 下列目录: DC=redmond,DC=wa,DC=microsoft,DC=com 如果我们类比文件系统的话,可被看作如下文件路径: Com/Microsoft/Wa/Redmond
例如:CN=test,OU=developer,DC=domainname,DC=com 在上面的代码中cn=test代表一个用户名,ou=developer代表一个active directory中的组织单位。 这句话的含义是test这个对象处在domainname.com域的developer组织单元中。
二、LDAP的安装
1.下载安装 openldap for windows,版本2.2.29.可以在百度上搜索openldap for windows。
安装很简单,一路 next 即可,假设我们安装在C:Program FilesOpenLDAP 2.配置 openldap,编辑 slapd.conf 文件
1)、打开C:Program FilesOpenLDAP slapd.conf,找到ucdata-path ./ucdata include ./schema/core.schema,在它后面添加 include ./schema/cosine.schema include ./schema/inetorgperson.schema
接下来的例子只需要用到以上三个 schema,当然,如果你觉得需要的话,你可以把其他的 schema 全部添加进来
include ./schema/nis.schema
include ./schema/openldap.schema
include ./schema/dyngroup.schema
include ./schema/collective.schema
include ./schema/corba.schema
include ./schema/duaconf.schema
include ./schema/java.schema
include ./schema/misc.schema
include ./schema/pmi.schema
include ./schema/ppolicy.schema
2)、下面我们做一个示例: 需要在 slapd.conf 配置文件中,找到 suffix “dc=my-domain,dc=com” rootdn “cn=Manager,dc=my-domain,dc=com” 把这两行改为 suffix "dc=mycompany,dc=com"
rootdn "cn=Manager,dc=mycompany,dc=com"
suffix 就是看自己如何定义了,后面步骤的 ldif 文件就必须与它定义了。还要注意到这个配置文件中有一个 rootpw secret,这个 secret 是cn=Manager 的密码,以后会用到,不过这里是明文密码,你可以用命令:slappasswd -h {MD5} -s secret (“secret“是自定义的密码,可以随便设置)算出加密的密码{MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==替换配置中的 secret。
3. 启动 OpenLDAP CMD 进入到C:Program FilesOpenLDAP 下, 1)、启动OpenLDAP-slapd服务:作用在于开机自动启动该服务项 slapd install OpenLDAP-slapd “OpenLDAP Directory Service” auto net start OpenLDAP-slapd NOTE: the “slapd install” is only needed if you didn’t choose the “create NTservice” option during installation.
当你完成这一步后,下次开机的时候就自动启动LDAP的服务了,不必再次手动启动。(此步也可以忽略不做!) 2)、启 动OpenLDAP服务器 在cmd下运行:slapd -d 1
启动成功可以看到控制台下打印一片信息,如下图
openldap 默认是用的 Berkeley DB 数据库存储目录数据的。
4. 建立条目,编辑导入 ldif 文件1) 新建一个 ldif(LDAP Data Interchanged Format) 文件(纯文本格式),例如 setup.ldif.
setup.ldif 文件内容如下:
- <span style="font-family: Arial;">dn: dc=mycompany,dc=com
- objectClass: top
- objectClass: dcObject
- objectClass: domain
- dc: mycompany
- dn: ou=roles,dc=mycompany,dc=com
- objectClass: top
- objectClass: organizationalUnit
- ou: roles
- dn: ou=people,dc=mycompany,dc=com
- objectClass: top
- objectClass: organizationalUnit
- ou: people
- dn: cn=Test Users,ou=roles,dc=mycompany,dc=com
- objectClass: groupOfUniqueNames
- cn: Test Users
- uniqueMember: uid=sspecial,ou=people,dc=mycompany,dc=com
- uniqueMember: uid=jbloggs,ou=people,dc=mycompany,dc=com
- dn: cn=Special Users,ou=roles,dc=mycompany,dc=com
- objectClass: groupOfUniqueNames
- cn: Special Users
- uniqueMember: uid=sspecial,ou=people,dc=mycompany,dc=com
- dn: cn=Admin Users,ou=roles,dc=mycompany,dc=com
- objectClass: groupOfUniqueNames
- cn: Admin Users
- uniqueMember: uid=admin,ou=people,dc=mycompany,dc=com
- dn: uid=admin,ou=people,dc=mycompany,dc=com
- objectClass: person
- objectClass: inetOrgPerson
- cn: State App
- displayName: App Admin
- givenName: App
- mail: admin@fake.org
- sn: Admin
- uid: admin
- userPassword: adminpassword
- dn: uid=jbloggs,ou=people,dc=mycompany,dc=com
- objectClass: person
- objectClass: inetOrgPerson
- cn: Joe Bloggs
- displayName: Joe Bloggs
- givenName: Joe
- mail: jbloggs@fake.org
- sn: Bloggs
- uid: jbloggs
- userPassword: password
- dn: uid=sspecial,ou=people,dc=mycompany,dc=com
- objectClass: person
- objectClass: inetOrgPerson
- cn: Super Special
- displayName: Super Special
- givenName: Super
- mail: sspecial@fake.org
- sn: Special
- uid: sspecial
- userPassword: password</span>
dn: dc=mycompany,dc=com
objectClass: top
objectClass: dcObject
objectClass: domain
dc: mycompany
dn: ou=roles,dc=mycompany,dc=com
objectClass: top
objectClass: organizationalUnit
ou: roles
dn: ou=people,dc=mycompany,dc=com
objectClass: top
objectClass: organizationalUnit
ou: people
dn: cn=Test Users,ou=roles,dc=mycompany,dc=com
objectClass: groupOfUniqueNames
cn: Test Users
uniqueMember: uid=sspecial,ou=people,dc=mycompany,dc=com
uniqueMember: uid=jbloggs,ou=people,dc=mycompany,dc=com
dn: cn=Special Users,ou=roles,dc=mycompany,dc=com
objectClass: groupOfUniqueNames
cn: Special Users
uniqueMember: uid=sspecial,ou=people,dc=mycompany,dc=com
dn: cn=Admin Users,ou=roles,dc=mycompany,dc=com
objectClass: groupOfUniqueNames
cn: Admin Users
uniqueMember: uid=admin,ou=people,dc=mycompany,dc=com
dn: uid=admin,ou=people,dc=mycompany,dc=com
objectClass: person
objectClass: inetOrgPerson
cn: State App
displayName: App Admin
givenName: App
mail: admin@fake.org
sn: Admin
uid: admin
userPassword: adminpassword
dn: uid=jbloggs,ou=people,dc=mycompany,dc=com
objectClass: person
objectClass: inetOrgPerson
cn: Joe Bloggs
displayName: Joe Bloggs
givenName: Joe
mail: jbloggs@fake.org
sn: Bloggs
uid: jbloggs
userPassword: password
dn: uid=sspecial,ou=people,dc=mycompany,dc=com
objectClass: person
objectClass: inetOrgPerson
cn: Super Special
displayName: Super Special
givenName: Super
mail: sspecial@fake.org
sn: Special
uid: sspecial
userPassword: password
2) 执行命令:ldapadd -x -D“cn=manager,dc=mycompany,dc=com” -w secret -f setup.ldif
注意: ldapadd 命令使用的前提是必须装过oracle数据库。我之前没装,会提示ldapadd是不可执行的命令,总之就是系统不认识这个命令。后来装了oracle之后就可以用了。
以上图示表示你已经将上述内容导入到LDAP数据库了。
5. LdapBrowser 浏览 可点击链接 http://www.blogjava.net/Files/Unmi/LdapBrowser282.rar下载。解压并双击lbe.bat批处理文件,弹出LDAP Browser窗口中默认会有一个OpenLdap_Localhost的链接,选edit
弹出下面的对话框,输入你的主机名:注意:如果是localhost 就不行。原因在哪里我也不很矛盾。输入你在slapd.conf文件中的DN,和密码。
SAVE—>>>Connect—>>>
连接成功之后看到的结构图:
6. Java 连接 openldap进行测试是否连接成功
- <span style="font-family: Arial;">package com.pccw.cms.test;
- import java.util.Hashtable;
- import javax.naming.Context;
- import javax.naming.NamingException;
- import javax.naming.directory.DirContext;
- import javax.naming.directory.InitialDirContext;
- publicclass LDAPTest {
- public LDAPTest() {
- }
- @SuppressWarnings("unchecked")
- publicstaticvoid main(String[] args) {
- String root = "dc=mycompany,dc=com"; //root
- @SuppressWarnings("rawtypes")
- Hashtable env = new Hashtable();
- env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
- env.put(Context.PROVIDER_URL, "ldap://192.168.3.51/" + root);
- env.put(Context.SECURITY_AUTHENTICATION, "simple");
- env.put(Context.SECURITY_PRINCIPAL, "cn=manager,dc=mycompany,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);
- }
- } </span>
package com.pccw.cms.test;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
public class LDAPTest {
public LDAPTest() {
}
@SuppressWarnings("unchecked")
public static void main(String[] args) {
String root = "dc=mycompany,dc=com"; //root
@SuppressWarnings("rawtypes")
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://192.168.3.51/" + root);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=manager,dc=mycompany,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);
}
}
7.启动OpenLDAP服务的批处理
新建一个文本文档,在文档写入一下内容:
@echo off
color 07
echo 正在启动HZCA-LDAP文件,请稍等........
cd /d C:Program FilesOpenLDAP
slapd -d 1
color 07
echo 启动失败!请重新启动OpenLDAP-slapd程序!输入启动指令:
slapd -d 1
echo.& pause
将文档保存为autoStart.bat 那么当你点击它是,就启动LDAP的服务了!(若你已经在前面将LDAP的服务设定为开机自动启动,那就不需要再次启动这个服务。)
好了,关于LDAP的基本配置就讲到这里。接下来的第二篇文章会讲述如何将LDAP与Tomcat整合配置,进行权限访问。