定制你的LDAP目录的Schema
(http://www.infoxa.com/asp/tech_file/xxnr_tech_201.htm) 第一部分:理解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。