打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
OpenLdap 简易教程
userphoto

2016.10.11

关注

总述

LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务。目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的优化。目录一般用来包含描述性的,基于属性的信息并支持精细复杂的过滤能力。目录一般不支持通用数据库针对大量更新操作操作需要的复杂的事务管理或回卷策略。而目录服务的更新则一般都非常简单。这种目录可以存储包括个人信息、web链结、jpeg图像等各种信息。为了访问存储在目录中的信息,就需要使用运行在TCP/IP 之上的访问协议—LDAP

LDAP目录中的信息是是按照树型结构组织,具体信息存储在条目(entry)的数据结构中。条目相当于关系数据库中表的记录;条目是具有区别名DN Distinguished Name)的属性(Attribute),DN是用来引用条目的,DN相当于关系数据库表中的关键字(Primary Key)。属性由类型(Type)和一个或多个值(Values)组成,相当于关系数据库中的字段(Field)由字段名和数据类型组成,只是为了方便检索的需要,LDAP中的Type可以有多个Value,而不是关系数据库中为降低数据的冗余性要求实现的各个域必须是不相关的。LDAP中条目的组织一般按照地理位置和组织关系进行组织,非常的直观。LDAP把数据存放在文件中,为提高效率可以使用基于索引的文件数据库,而不是关系数据库。类型的一个例子就是mail,其值将是一个电子邮件地址。

LDAP的信息是以树型结构存储的,在树根一般定义国家(c=CN)或域名(dc=com),在其下则往往定义一个或多个组织 (organization)(o=Acme)或组织单元(organizational units) (ou=People)。一个组织单元可能包含诸如所有雇员、大楼内的所有打印机等信息。此外,LDAP支持对条目能够和必须支持哪些属性进行控制,这是有一个特殊的称为对象类别(objectClass)的属性来实现的。该属性的值决定了该条目必须遵循的一些规则,其规定了该条目能够及至少应该包含哪些属性。例如:inetorgPerson对象类需要支持sn(surname)cn(common name)属性,但也可以包含可选的如邮件,电话号码等属性。

 简称对应

  1. o– organization(组织-公司)
  2. ou – organization unit(组织单元-部门)
  3. c - countryName(国家)
  4. dc - domainComponent(域名)
  5. sn – suer name(真实名称)
  6. cn - common name(常用名称)

 

1、获取资源及安装

Openldap 可以安装在windows 环境下 也可以安装在linux环境下

Openldap for windows下载地址:http://download.bergmans.us/openldap/openldap-2.2.19/openldap-2.2.19-db-4.3.21-openssl-0.9.7e-win32.exe

Linux版本的在这里不做介绍。

显然这个版本是2.2.19  数据库版本是4.3.21 openldap默认使用的是Berkeley DB数据库,在安装ldap时就会自动安装上这个数据库,基本上不用怎么操作数据库

 

安装openldap 很简单,只需要按照提示一步一步的完成即可,最好安默认设置来,因为有一步是把openldap启动注册为windows服务,这一步最好是按照默认设置来。默认安装是在 C:\Program Files\OpenLDAP下。

 

安装完成后基本上就搭建好了ldap环境,但是现在openldap的服务并没有启动,这个并不重要,下面我们将配置openldap,配置完成后我们再启动openldap

 

2、配置openldap

配置步骤网上有很多说明,但是都大同小异,只是有一些值得注意的细节方面有可能会造成日后维护的麻烦,甚至是配置出错,导致无法启用openldap,下面详细介绍下按照步骤,及值得注意的问题。

 

1) Openldap启动后是通过一个名为slapd.conf 文件来加载配置的,所以我们来配置slapd.conf文件,这个文件存在安装路径下在的OpenLDAP文件夹中,用记事本打开这个文件。

找到include              ./schema/core.schema 这一句 在后面加上如下代码

include         ./schema/corba.schema

include         ./schema/cosine.schema

include         ./schema/dyngroup.schema

include         ./schema/inetorgperson.schema

include         ./schema/java.schema

include         ./schema/misc.schema

include         ./schema/nis.schema

include         ./schema/openldap.schema

这些schema文件是一些操作ldap服务的方法和说明,我们都加上,当然有些事没有用的,日后可以根据情况将没有用处的条目删掉。

 

2) 还是在 sldap.conf 文件中,找到

suffix "dc=my-domain,dc=com"

rootdn "cn=Manager,dc=my-domain,dc=com"

这一部分是修改你要建立的dn的基准标识名,即要新建的ldap服务器的根。

LDAP目录树的最顶部就是根,也就是所谓的基准DN"。基准DN通常使用下面列出的三种格式之一。假定我在名为FooBar的电子商务公司工作,这家公司在Internet上的名字是foobar

  o="FooBar, Inc.", c=US

  (以X.500格式表示的基准DN

  在这个例子中,o=FooBar, Inc. 表示组织名,在这里就是公司名的同义词。c=US 表示公司的总部在美国。以前,一般都用这种方式来表示基准DN。但是事物总是在不断变化的,现在所有的公司都已经(或计划)上Internet上。随着Internet的全球化,在基准DN中使用国家代码很容易让人产生混淆。现在,X.500格式发展成下面列出的两种格式。

  o=foobar . com

  (用公司的Internet地址表示的基准DN

  这种格式很直观,用公司的域名作为基准DN。这也是现在最常用的格式。

  dc=foobar, dc=com

  (用DNS域名的不同部分组成的基准DN

就象上面那一种格式,这种格式也是以DNS域名为基础的,但是上面那种格式不改变域名(也就更易读),而这种格式把域名:foobarcom分成两部分 dc=foobar, dc=com。在理论上,这种格式可能会更灵活一点,但是对于最终用户来说也更难记忆一点。考虑一下foobarcom这个例子。当foobarcomgizmocom合并之后,可以简单的把“dc=com"当作基准DN。把新的记录放到已经存在的dc=gizmo, dc=com目录下,这样就简化了很多工作(当然,如果foobarcomwocketedu合并,这个方法就不能用了)。如果LDAP服务器是新安装的,我建议你使用这种格式。再请注意一下,如果你打算使用活动目录Active Directory),Microsoft已经限制你必须使用这种格式。

 

按照这个思路我们把配置文件sladp.conf中的这两行改为

suffix "dc=hebqts,dc=gov.cn"

rootdn "cn=Manager, dc=hebqts,dc=gov.cn"

suffix 就是看自己如何定义了,这里我们定义成"dc=hebqts,dc=gov.cn",后面步骤的 ldif 文件就必须与它定义一致。

rootdn 标明了管理员Manager 所在的目录。这里Manager是管理ldap服务器的管理员,我们会经常用到它。

 

3)还要注意到这个配置文件中有一个 rootpw secret,这个 secret Manager 即管理员的密码,不过这里是明文密码

网上有介绍用命令: slappasswd -h {MD5} -s secret secret装换成MD5密文算出加密的密码 {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ== 取代配置中的 secret,但是测试期间建议使用明文的密码。

关于转成密文后在复制密文到配置文件的时候一定要注意,密文前的{MD5}标记千万不能丢掉,而且在rootpw 和密码 {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==中间不是用空格隔开的,而是用的一个制表键 Tab 键隔开的,千万不要打空格,密文后面也不要打空格,不然会出现错误。所以建议测试时不要去改明文密码。

 

4)经过以上步骤基本上配置完完成了,当然还有一些acl的配置,当用到的时候我们再设置。下面就是启动ldap服务 有两种方一种在安装的时候提到过,安装的时候默认是将openldap启动注册成了windows服务,我们可以再为windows服务管理里找到openldap 启动它,另一种是用命令启动,在第一次运行的时候建议使用命令启动,这样我们可以找到一些问题。

用命令提示符进到openldap的安装目录 输入如下命令 sladp –d 1 这个是以控制台模式启动服务


当出现 slapd starting 时说明配置正确,我们已经启动了服务,接下来就可以对lapd目录经行操作了。注意这个窗口不要关掉。

 

3、导入一些数据

现在ldap的环境基本上搭建好了,但是这是ldap的目录是空的,没有什么数据,我们用一些工具去连接ldap服务的时候会出现一些问题,所以我们先来导入一些数据。

我们记事本编写一个后缀问ldif的文件,假设是test.ldif

内容如下:

dn: dc=hebqts,dc=gov.cn

objectClass: top

objectclass: dcObject

objectClass: organization

dc: hebqts

o: hebqts

 

dn: ou=Corporate,dc=hebqts,dc=gov.cn

objectClass: organizationalUnit

ou: Corporate

 

dn: ou=Admin,ou=Corporate,dc=hebqts,dc=gov.cn

objectClass: organizationalUnit

ou: Admin

 

dn: cn=Frog Chou,ou=Admin,ou=Corporate,dc=hebqts,dc=gov.cn

objectClass: inetOrgPerson

cn: Frog Chou

cn: chouchou

description: chouchou

mail: frogchou@163.com

postalAddress: jianshedajia

postalCode: 050031

sn: chou

telephoneNumber: 15930189920

title: software

 

我们简单分析一下以上内容:

首先是第一段

dn: dc=hebqts,dc=gov.cn

objectClass: top

objectclass: dcObject

objectClass: organization

dc: hebqts

o: hebqts

dn就是根标识 这里指明根为dc=hebqts,dc=gov.cn,以后建立的组织单元和人员都要在根下

objectclass指明根有三个属性objectClass: top   objectclass: dcObject  objectClass: organization 其中dcObject organization 属性值必须存在的,因为我们建立的是基于域名的根,所以这里必须有dc 的属性值。

dc o 是必须存在的 标识根的标记。

第二段

dn: ou=Corporate,dc=hebqts,dc=gov.cn

objectClass: organizationalUnit

ou: Corporate

dn 是组织单元Corporate的完整标识,标明Corporate是在根dc=hebqts,dc=gov.cn下的一个组织单元。

objectClass指明了Corporate 为一个组织单元,其中值organizationalUnit指明了Corporate的属性。

ou:是必须的Corporate属性值为Corporate

第三段类同第二段在组织单元Corporate下新建了一个子的组织单元Admin

第四段

dn: cn=Frog Chou,ou=Admin,ou=Corporate,dc=hebqts,dc=gov.cn

objectClass: inetOrgPerson

cn: Frog Chou

cn: chouchou

description: chouchou

mail: frogchou@163.com

postalAddress: jianshedajia

postalCode: 050031

sn: chou

telephoneNumber: 15930189920

title: software

这一段是一条人员信息,人员的名称是Frog Chou 他在Admin组织单元下。

objectClass: inetOrgPerson 表明Frog Chou的属性为inetOrgPerson 即组织里的人

cn: Frog Choucn: chouchou 表明了Frog Chou有两个常用的名字,注意,这里cn的值可以有多个,但是要一行一行分开写。

下面就是还有个sn 表明了Frog Chou的别名

人员中dn cn sn objectClass是必须有的属性,其他的descriptionmailtelephoneNumbertitle等可以没有。

 

我们将文件保存C:\Program Files\OpenLDAP下,打开命令提示符,进到C:\Program Files\OpenLDAP ,在这里我们执行一下命令:ldapadd -x -D "cn=Manager,dc=hebqts,dc=gov.cn" -W -f test.ldif  其中注意大小写,参数xf 是小写的,D W是大写的。

这条命令是将test.ldif中的组织机构和人员信息导入到ldap服务器中,输入完成后回车,系统提示你输入密码,这里密码就是我们前面说的manager的密码secret ,回车我们就可以导入了。

我们可以在命令中加上参数“c 来帮助我们查看导入每条数据的情况,即命令ldapadd -x –c -D "cn=Manager,dc=hebqts,dc=gov.cn" -W -f test.ldif 两条命令是相同时效果:

 

如果现实这样,我们就导入成功了。

 

4、验证

经过上面的步骤我们基本上完成了部署,并且有了一些数据,我们可以通过一个java小程序来验证下ldap对外服务是否正常:

 

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   static   void  main(String[] args) {  

    LDAPTest LDAPTest1 =  new  LDAPTest();  

    String root =  "dc=hebqts,dc=gov.cn" ;  //  

    Hashtable env =  new  Hashtable();  

    env.put(Context.INITIAL_CONTEXT_FACTORY,  "com.sun.jndi.ldap.LdapCtxFactory" );  

    env.put(Context.PROVIDER_URL,  "ldap://localhost/"  + root);   //ip地址本机就是localhost   

    env.put(Context.SECURITY_AUTHENTICATION,  "simple" );  

    env.put(Context.SECURITY_PRINCIPAL,  "cn=Manager,dc=hebqts,dc=gov.cn" );  //管理员

 

    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) {  

      }  

    }  

  }  

 

我们编译一下,运行,如果为下图

说明运行成功。

 

 

5、管理ldap

对于管理ldap服务器的第三方软件有很多,这里我们介绍一下JXplorer ,个人觉得这个软件还是比较强大的。

下载地址可以再网上搜索下,安装很简单,默认设置就可以了。

 

点连接,弹出对话框,按照图上的填写完成就写了,ok 进入控制台:

这里,我们可以新建,删除,维护数据,用法很简单,功能也很简单,基本上研究几分钟就完全掌握了。

 

6java 操作 ldap

我们在java程序中如何操作ldap,有两种方法:

1、通过JDNIJNDI全名为Java Naming and Directory Interface.JNDI主要提供应用程序所需要资源上命名与目录服务

我们上面那个例子就是用了它,这个软件包在jdk中是自带的。

2、通过第三方jar包使用其中的方法操作。我们下载novell-jldap-devel-2009.10.07-1netware_windows.exe 这是novell研发的jldap产品,其中最关键的是ldap.jar文件。

这个软件的下载地址是http://www.novell.com/developer/ndk/ldap_classes_for_java.html

安装很简单,下一步一下步,但是我们只要安装目录下的ldap.jar文件,当然我们可以再安装目录下找到很多有用的例子,通过例子我们能很好的利用这个jar包完成java应用程序对ldap的操作。我们附上一部分例子:

 

首先建立一个LDAPConnection对象。这个对象也可以通过连接池PoolManager来获得。LDAPConnection con = new LDAPConnection();然后运行connect方法和bind方法。连接上LDAP以后,就可以通过search方法来查找数据了。示例程序如下:
java
代码
LDAPConnection lc = new LDAPConnection();    
       try {    
           lc.connect("172.168.1.144",389);    
           lc.bind(LDAPConnection.LDAP_V3,"cn=manager,dc=hebqts,dc=gov,cn","secret");    
           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();    
       }   

 

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

连接后,可以建实体了,也就相当与为数据库添加一条新的记录。这里用到了几个类:LDAPEntryLDAPAttributeLDAPAttributeSet。首先建立一个LDAPAttributeSet,然后建立各种的LDAPAttribute,把他们addLDAPAttributeSet中。然后建立一个LDAPEntry。其构造函数有两个参数,一个是这个LDAPEntryDN,一个是他的属性集合,也就是LDAPAttributeSet 
  
最后,调用LDAPConnection实例化对象的add方法,把实体添加到服务器中。然后别忘了断开连接喔。整体的示例代码如下:

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("172.168.1.144", 389);   
con.bind(LDAPConnection.LDAP_V3, "cn=manager,dc=hebqts,dc=gov,cn","secret");   
con.add(entry);   
System.out.println("
成功的添加了一条记录!");   
con.disconnect();  
    
这里来说一说怎么从LDAP中删除一个实体。 
首先,连接LDAP服务器,然后通过DN来删除一个实体。
示例代码如下:
java
代码
LDAPConnection con = new LDAPConnection();    
con.connect("172.168.1.144",389);    
con.bind(LDAPConnection.LDAP_V3, "cn=manager,dc=hebqts,dc=gov,cn","secret");    
con.delete("cn=JSmith,dc=excel,dc=com,dc=cn");    
System.out.println("
成功删除一条记录!");   

 

总结:

通过以上学习,基本上掌握了 ldap 的相关操作,并且通过 jar 包我们可以轻松的完成 java 项目对 ldap 的操作,当然在项目中, jldap 目录下的例子是必须看的,那些例子基本上解决了项目中的所有问题。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
OpenLDAP学习笔记 - kenter1643 - JavaEye技术网站
Linux下安装openldap
centos6.4安装配置LDAP服务
LDAP初玩
RHCSA 系列(十四):在RHEL 7 中设置基于LDAP 的认证
jldap实现Java对LDAP的基本操作 | micmiu
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服