兔八哥笔记12:定制你的LDAP目录的Schema
第一部分:理解LDAP的Attribute
LDAP之所以成功或之所以流行的原因是LDAP可以存储很多种类型的信息。而LDAP的Schema定义并控制了LDAP中可以存储什么样的数据。作者的这一系列文章包括4部分,这是第三部分。
1.什么是LDAP的Schema?
在LDAP目录中,Schema是定义的Attribute、定义的objectClass和控制什么样的数据被存到哪里的ACI的集合。
任何的数据库都有一个Schema,下一个简单的定义:Schema是一个数据模型,它被用来决定数据怎样被存储,被跟踪的数据的是什么类型,存储在不同的Entry下的数据之间的关系。
当你搭建好你的LDAP后,一些已经定义好的Entry的信息存储在一系列的Attribute中的值中。你也可以创建一个要存储在LDAP中的新的值类型。
所有的Attribute可能被放到一起用来组成一个叫做Object Class的类型。为了满足你的需要,你可以定义自己的Object Class,每一个Object Class中的属性都可以设计成reqired(必选的)或optional(可选的)。
如果你熟悉关系型数据库,那么下面的描述有助于你对Schema的理解:Attribute相当于字段(Field),而Object Calss相当于表。
你可以设计你的LDAP信息树(DIT),在同一个Entry存储许多相似的Object Class。
2.理解LDAP的Attribute
简单的说,Attribute是可以存放一个单一类型信息的容器。(采用Key/Value进行对应)。
定制Schema可以使你设计很多你需要的Attribute,如你喜欢的食物、生日、工作日期等等,但你也不得不为你的目录服务器的配置文件(Schema)添加正确的Attribute。
一个Attribute包括以下几个部分,我们稍后会详细介绍。
n Attribute名字
n 描述
n Attribute的对象标识符(OID)
n 用于进行类型检查和模式匹配的语法
n Attribute是否允许有多个值
(1)什么是Attribute的名字?
这在概念上已经很清晰了,但在你自己创建一个新属性类型之前,你应该检查一下LDAP规范中是否已经存在能够满足你的要求的Attribute。你可以从下面这个站点查找已经定义好的object class的Attribute列表:http://www.ldapman.org/schema-references。
假设你需要的Attribute不存在,那么你要自己添加。首先你应该为自己将要添加的属性定义一个新的名字,需要注意的是你的Attribute的名字要避免与很可能成为“官方指定”的Attribute的名字冲突。
你可以用你的单位、公司甚至停车场的ID来作为你的Attribute的名字。当定义Schema时,Gizmo公司的LDAP的系统管理员很可能定义这样的名字作为Attribute名:"gizmoParkingPassNumber”。我们可以看到这个Attribute名字可以很好避免同日后的官方指定的Attribute名字冲突。
请注意“gizmoParkingPassNumber”作为Attribute看起来很优美,你应该养成这样的习惯:Attribute的名字的第一个字母必须小写,其他单词的第一个字母必须大写,其他的字母必须小写,并且你的Attribute名字应该足够长,这样可以根据你的Attribute的名字就可以知道它所存储的数据的意义。
Attribute的名字由a-z,0-9以及其他少量的字母构成,名字的第一个字符必须是字母,空格、下划线及一些特殊字符是不允许出现在Attribute的名字中的。
(2)描述
是一个描述Attribute的用途的注释。
(3)对象标识符(Object Identifiers)
对象标识符(OID)是被LDAP内部数据库引用的数字。Attribute的名字是让你和我看的,但计算机不喜欢,因为计算机处理数字是最有效率的。如果你对DNS的概念很熟悉的话,那么你应该很容易理解这点。比如:www.sendmail.net 这个域名被计算机接收后会翻译成一个IP地址。
当计算机接收到Attribute的名字gizmoParkingPassNumber后,将这个名字转换为一个OID,这个例子中将转换为:1.3.6.1.4.1.1234。
在你定制自己的object class和Attribute之前,你需要为自己的OID注册吗?这要取决于你的目录服务器。很多目录服务器允许你指定一个简单的字符串作为OID。如果Gizmo公司没有注册,1.3.6.1.4.1.1234可能已经分配给了“gizmoParkingPassNumber”,但它仍然是唯一的,依然可以正常的工组。
你可以不注册你的OID,但它仍然是个好主意。LDAP的Attribute、语法定义和所有使用OID的object class及SNMP和其他的支持ANSI的统一标识Schema的协议都是这样做的。
得到自己的OID很容易,你可以向ANSI (American National Standards Institute)致富1000美元(注:这是2000年的价格,现在什么行情就不知道了!^_^)得到自己的OID,你也可以从权威机构得到你的免费的OID:http://www.iana.org/。
(4)语法(syntax)
当你创建Attribute时,下表列出了你要经常使用的语法。
code
syntax name
Description
Dn
Distinguished Name
Allows any alphanumeric string.
Pattern matching against fields of type DN are normalized for DN equivalency. For example,
"uid=ratboy,ou=accounts,dc=ldapman,dc=com" is equivalent to
"uid=Ratboy, ou=Accounts, dc=LDAPman, dc=com"
Cis
Case Ignore String
Allows any alphanumeric string. Information stored using cis is stored with the case preserved, but matches are performed with case ignored. This is the most commonly used syntax type because of its versatility.
ces
Case Exact String
Allows any alphanumeric string. Matches against attributes of format cis are case sensitive. Used for attributes like passwords, where you only wish to match exact strings.
int
Integer
Allows only integers to be stored in this attribute.
tel
Telephone Number
Like cis, but when searching against attributes of this type, the match ignores spaces and dashes. This allows "510-555-1212" to match "510 555 1212".
bin
binary
Used to store binary data in a standardized format.
一些LDAP目录允许你添加定制的语法。具体怎样做超出了本文的范围,我只是顺便提醒你一下。当创建自己的语法时,你可以为自己的Attribute指定只允许指定的字符存储在Attribute中,并且你也可以指定匹配规则。
假如你想在目录中存储十六进制的代码,但你并不关心代码以什么格式存储(一些人可能输入00 A2 34 FF,另一些可能输入00a234ff,肯能还有人输入00a2.34ff,你想匹配任何一种格式)。为了满足需要,你需要定义一个新的类型hex的语法,只允许字符串0-9,a-z和空格。匹配将是大小写不敏感的,并删除所有的空格进行格式化。很快!任务完成了。
关于创建自定义的语法更详细的信息,你可以在你使用的LDAP的使用手册中找到。
(5)请恕我冒昧,你是单身吗?(作者有些调侃的味道!)
一些(不是所有)的LDAP服务器允许你为Attribute指定“single”,它的用处是保证你的目录中的属性只有一个值。我们举个例子:一个员工叫Mike Jones,你可以为它的CN指定多个值(Michael Jones、Mike Jones),但存储它的邮箱时你希望只存储一个值。
好了,本文的第2部分将讨论object class和怎样使用Attribute构建自己的object class,第3部分我们将使用第1和第2部分学习到的知识创建一个新的object class,并设计你的LDAP目录的Schema。
如果你有问题,请发邮件给我:donnelly@ldapman.org.。
2000年8月3日
怎么,你是否想读到后2部分呢?哈哈,我也想!所以,我几天前给Mr. Michael Donnelly发了封邮件,希望能够拜读到后续部分,因为那几天我正在查ObjectClass的内容,Michael Donnelly很快回复了,说后续部分尚未完成,已经计划在近期完成,看来我们要再等待一段时间了。但有些夸张了吧?3年多了,还没写完?不过我们要感谢他所做的工作,至少让我们向LDAP的应用方面迈出了第一步!
兔八哥
2003-12-4 中午