LDAP目录以树状的层次结构来组织和存储数据,目录由目录入口对象 (Entry)组成,目录入口对象(Entry)相当于关系数据库中表的记录,可直接成为 LDAP目录记录,是具有区别名DN(Distinguished Name)的属性(Attribute) 集合,DN相当于关系数据库表中的关键字(Primary Key);属性由属性类型 (Type)和多个值(Va lu e s)组成,相当于关系数据库中的域(Field)由域名和 数据类型组成,只是为了方便检索和灵活性的需要,LDAP中的Type可以有多 个Va lu e,而不是关系数据库中为降低数据的冗余性要求实现的各个域必须是不 相关的。
这样,有以下好处:
- 一般按照地理位置和组织关系进行组织数据,同现实世界相一致,非常的直观;
- 有利于根据目录树的结构给予不同的员工/用户组不同的权限;
- 属性类型可以多个属性值,LDAP目录就有很大的灵活性,不必为加入一些新的数据就重新创建表和索引;
- LDAP把数据存放在文件中,可以使用基于索引的文件数据库,大大方便了检索,提高了检索效率;
- 有利于将某个地域/分支机构或某个部门/下属单位的用户信息定制推送到单独的用户目录服务器上,提高相关应用对用户信息的访问效率;
- 把LDAP存储和复制功能结合起来,可以定制目录树的结构以降低对WAN带宽的要求。
LDAP目录记录的标识名(Distinguished Name,简称DN)是用来读取单个记
录,以及回溯到树的顶部。
基准DN:
LDAP目录树的最顶部就是根,也就是所谓的“基准DN”。基准DN通常使用下面的格式,如:o=orgname.com.cn (用组织机构的域名/Internet地址作为基准DN,这种格式很直观,这也是现在最常用的格式)。
在目录树中怎么组织数据:
LDAP目录树的最顶部就是根。在根目录下,因为历史上(X.500)的原因,大
多数LDAP目录用OU从逻辑上把数据分开来。
OU表示“Organization Unit”,在X.500协议中是用来表示单位内部的机构
部门。现在LDAP还保留ou=这样的命名规则,但是扩展了分类的范围,可以分
类为:ou=people, ou=groups, ou=devices,等等。更低一级的OU有时用来做更细
的归类。例如:LDAP目录树(不包括单独的记录)可能会是这样的:
o=orgname.com.cn ou=employees ou=office ou=hr ou=finance ou=sales ou=rd ou=groups ou=customers ou=china ou=asia ou=europe ou=rooms ou=assets-mgmt
单独的LDAP记录:
DN是LDAP记录项的名字。在LDAP目录中的所有记录项都有一个唯一的“Distinguished Name”,也就是DN。每一个LDAP记录项的DN是由两个部分组成的:相对DN(RDN)和记录在LDAP目录中的位置。
RDN是DN中与目录树的结构无关的部分。在LDAP目录中存储的记录项都要有一个名字,这个名字通常存在cn(Common Name)这个属性里。在LDAP中存储的对象都用它们的cn值作为RDN的基础。
完整的DN,比如,为一个员工“张三”设置一个DN:
cn=zhang san, ou=employees, o=orgname.com.cn(基于姓名) uid=szhang, ou=employees, o=orgname.com.cn(基于登录名,推荐)
推荐采用基于登录名的方式设置DN,因为基于姓名这种格式有一个很明显的缺点---如果名字改变了,LDAP的记录就要从一个DN转移到另一个DN,但是,我们应该尽可能地避免改变一个记录项的DN;而大多数单位都会给每一个员工唯一的登录名,因此用这个办法可以很好地保存员工的信息,而不用担心以
后还会有一个叫“张三”的加入,或者“张三”改变了名字,也用不着改变LDAP记录项的DN。
记录项:
LDAP目录以一系列“属性对”的形式来存储记录项,每一个记录项包括属性类型和属性值(这与关系型数据库用行和列来存取数据有根本的不同)。
例如,机构单位orgname.com.cn的员工“张三”的LDAP记录。这个记录项的格式是LDIF,用来导入和导出LDAP目录的记录项。
dn: uid=szhang, ou=employees, o=orgname.com.cn objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson objectclass: orgnamePerson uid: szhang givenname: zhang sn: san cn: Zhang San cn: Zhang Shan cn: 张三 cn: 张总 telephonenumber: 8610-82825858 roomnumber: 122G o: orgname, Inc. dept: sales role: salesmanager mailRoutingAddress: [email protected] mailhost: mail.orgname.com.cn userpassword: {crypt}3x1231v76T89N uidnumber: 1234 gidnumber: 1200 homedirectory: /home/szhang loginshell: /usr/local/bin/sh
LDAP目录可以定制成存储任何文本或二进制数据,到底存什么要由你自己决定。LDAP目录用对象类型(object classes)的概念来定义运行哪一类的对象使用什么属性。在几乎所有的LDAP服务器中,你都要根据自己的需要扩展基本的LDAP目录的功能,创建新的对象类型或者扩展现存的对象类型。
属性的值在保存的时候是保留大小写的,但是在默认情况下搜索的时候是不区分大小写的。某些特殊的属性(例如,password)在搜索的时候需要区分大小写。
请注意LDAP目录被设计成允许某些属性有多个值,如一个员工可能拥有多个名字,可以用其任何一个名字检索都可以找到该员工的电话号码、电子邮件和办公房间号,等等;而不是在每一个属性的后面用逗号把一系列值分开。因为用这样的方式存储数据,所以LDAP目录就有很大的灵活性,不必为加入一些新的数据就重新创建表和索引。更重要的是,LDAP目录不必花费内存或硬盘空间处理“空”域,也就是说,实际上不使用可选择的域也不会花费你任何资源。