OpenLDAP 2.1 管理员指南(3)
时间:2007-04-23 来源:yn0287
6、 运行SLAPD
slapd被设计为可以作为一个单独的服务器运行。这允许服务器充分的利用缓存,利用底层数据库的特性来管理并发,并且节省系统资源。从inetd(8)来运行slapd(8)不能作为选项。
6.1、 命令行选项
slapd(8)支持大量的命令行选项。它们在手册页中有详细的说明。本部分详细说明了几个常用的选项。
-f
该选项说明了可以为slapd使用的另外的配置文件。缺省选项是正常情况下的/usr/local/etc/openldap/slapd.conf。
-h
该选项说明了另外的侦听器配置。缺省的是ldap:///,它表示运行在TCP上的LDAP,在缺省的389端口侦听所有的网络界面。可以指明特殊的主机——端口对或者其他的协议模式(比如,ldaps://或者ldapi://)。例如:-h “ldaps:// ldap://127.0.0.1:666”将创建两个侦听器:一个在默认的LDAP/SSL的636端口,侦听所有网络界面上的通过SSL的LDAP请求,另一个在localhost(环回地址)界面上侦听666端口。主机可以使用IPV4的点分十进制格式,或者使用主机名称。端口必须是数字。
-n
该选项说明了用来进行日志记录或者其他用途的服务名称。默认的服务名称是slapd。
-l
该选项指明了用于syslog(8)应用的本地用户。可以是LOCAL0,LOCAL1,LOCAL2,……LOCAL7等数值。默认值是LOCAL4。该选项并不是在所有系统上都支持。
-u user -g group
该选项分别指明了用来运行的用户或者组的身份。User可以是用户名或者uid,group可以是组名或者gid。
-r directory
该选项指明了一个运行时的目录。slapd将在打开侦听器并且读取任何配置文件或者初始化任何后端数据库之前使用chroot(2)到该目录。
-d | ?
该选项设置slapd的调试级别为。当level是“?”的时候,无论传递给它任何选项,将打印不同的调试级别,然后slapd终止。当前的调试级别是:
Table 6.1: Debugging Levels |
|
Level |
Description |
-1 |
enable all debugging |
0 |
no debugging |
1 |
trace function calls |
2 |
debug packet handling |
4 |
heavy trace debugging |
8 |
connection management |
16 |
print out packets sent and received |
32 |
search filter processing |
64 |
configuration file processing |
128 |
access control list processing |
256 |
stats log connections/operations/results |
512 |
stats log entries sent |
1024 |
print communication with shell backends |
2048 |
print entry parsing debugging |
可以在调试选项中指定多个调试级别。每次指定一个。或者,因为调试级别是可以相加的,可以指定它们的和。比如,如果需要跟踪函数调用,并且查看正在处理的配置文件,可以设置该选项为:-d 65。或者,可以设定为:-d 1 –d 64。参阅获取更详细的信息。
注意:为了使得除了两个统计级别之外的调试信息生效,slapd必须在编译时定义_DLDAP_DEBUG。
6.2、 启动SLAPD
通常情况下,slapd可以以如下方式运行:
/usr/local/etc/libexec/slapd []*
其中,/usr/local/etc/libexec是由configure脚本决定的,并且是上面描述的选项之一(或者是在slapd(8)中描述)。除非指明了一个调试级别(包括级别0),slapd将会自动fork一个进程,并且从控制它的终端脱离,在后台运行。
6.3、 停止SLAPD
为了安全的停止slapd,应该是用下面的命令:
kill -INT `cat /usr/local/var/slapd.pid`
其中,/usr/local/var由configure脚本决定。
使用其他的暴力方法停止slapd可能造成信息丢失或者数据库崩溃。
7、 数据库创建和维护工具
本部分告诉您如何从脚本中创建slapd数据库,以及如何在遇到问题的时候定位和解决问题。有两种方法创建数据库。首先,可以联机使用LDAP来创建数据库。通过这种方法,只需要简单的启动slapd,然后,使用LDAP客户端向其中增加条目。该方法对于创建小规模的数据库而言是比较适合的(几百条或者上千条条目)。该方法适合于支持更新的数据库。
第二种创建数据库的方法是使用slapd提供的特殊的应用程序脱机执行。如果您有大量的条目需要创建,使用LDAP的方法将消耗太多的时间,或者如果您想确保数据库在创建的时候没有被访问。注意,不是所有的数据库类型都支持这些应用程序。
7.1、 在LDAP上创建数据库
通过这种方法,您使用LDAP客户端(比如:ldapadd(1))来增加条目。您应该确认在启动slapd(8)之前在配置文件中设置了如下选项:
suffix
如“通用数据库指令”部分所描述的,该选项定义了该数据库中保存的条目。应该将它设置为将要创建的子树的root DN。例如:
suffix "dc=example,dc=com"
应该确保指定了索引文件应该被创建的目录:
directory
例如:
directory /usr/local/var/openldap-data
应该使得该目录具有正确的权限,使得slapd可以写入。
还应该配置slapd,以便您可以以具有增加条目权限的用户身份连接。可以配置目录来为该操作指定一个特定的超级管理员用户。这可以通过在数据库定义中使用下面的两个选项实现:
rootdn
rootpw
例如:
rootdn "cn=Manager,dc=example,dc=com"
rootpw secret
这些选项制定了一个DN和口令,该DN可以被作为超级用户的数据库条目进行认证(该条目允许执行任何操作)。这儿指定的DN和口令总是能够工作,无论该条目的名称实际上是否存在,或者无论其口令是什么。这样就解决了在没有任何条目的情况下如何认证的先有鸡还是先有蛋的问题。
最后,还应该确保数据库定义包含了需要的索引定义:
index { | default} [pres,eq,approx,sub,none]
例如,要索引cn,sn,uid和objectclass属性,可以使用下面的索引指令:
index cn,sn,uid
index objectClass pres,eq
注意,并不是所有的索引类型对于多有的属性类型都是可用的。参阅“SLAPD配置文件”部分查看该选项的更详细的信息。配置完毕之后,启动slapd,使用LDAP客户软件连接到LDAP,开始增加条目。比如,要使用ldapadd工具增加一个组织条目和一个组织角色条目,应该创建一个包含如下所示内容的entries.ldif文件:
# Organization for Example Corporation
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
dc: example
o: Example Corporation
description: The Example Corporation
# Organizational Role for Directory Manager
dn: cn=Manager,dc=example,dc=com
objectClass: organizationalRole
cn: Manager
description: Directory Manager
然后,使用下面的命令创建条目:
ldapadd -f entries.ldif -x -D "cn=Manager,dc=example,dc=com" -w secret
上面的命令假设按照上面例子中的配置。
7.2、 脱机创建数据库
创建数据库的第二种方法是使用下面描述的slapd数据库工具脱机创建。如果有大量的条目需要创建,该方法是最好的。这些工具读取slapd的配置文件,和一个包含要增加的条目的文本描述的输入文件。对于支持这些工具的数据库类型而言,它们直接创建出数据库文件。(否则,您必须使用上面提到的方法)。首先,您必须在数据库定义的配置文件中设置几个非常重要的配置选项:
suffix
正如在“通用数据库指令”部分所描述的,该选项设置了该数据库保存哪些条目。你应该将该选项设置为您要创建的子树的root DN。例如:
suffix "dc=example,dc=com"
应该确保指定了索引文件应该被创建的目录:
directory
例如:
directory /usr/local/var/openldap-data
最后,还应该确保数据库定义包含了需要的索引定义。这可以通过一个或者几个index指令来实现:
index { | default} [pres,eq,approx,sub,none]
例如,要索引cn,sn,uid和objectclass属性,可以使用下面的索引指令:
index cn,sn,uid
index objectClass pres,eq
这为cn,sn,和uid创建了存在,相等和子串索引,为objectclass属性创建了相等索引。参与配置文件部分获得更多信息。
7.2.1、 slapadd程序
在配置好所有设置之后,您可以运行slapadd程序来创建主要的数据库及其索引。
slapadd -l -f
[-d ] [-n |-b ]
其参数的含义如下:
-l
说明了包含要增加的条目的文本格式的LDIF输入文件(参阅后面的“LDIF文本条目格式”部分)。
-f
说明了slapd配置文件的格式。该配置文件说明了在何处创建索引,以及创建什么索引等等。
-d
打开调试。如所说明的。调试级别和slapd相同。参阅“运行SLAPD”中的“命令行选项”部分。
-n
一个说明修改那一个数据库的可选参数。第1个列在配置文件中的数据库是1,第2个是2……等等。默认情况下,使用配置文件中的第1个数据库。该选项不能和-b参数一起使用。
-b
一个说明修改那一个数据库的可选参数。指定的后缀和数据库suffix指令相匹配来获得数据库编号。不应该和-n一起使用。
7.2.2、 slapindex程序
有时重新安排索引是必须的(比如修改了slapd.conf(5)之后)。可以通过使用slapindex(8)程序来实现。slapindex运行方法如下:
slapindex -f
[-d ] [-n |-b ]
其中,-f –d –n和-b选项和slapadd程序中的含义相同。Slapindex根据当前数据库的内容重新创建索引。
7.2.3、 slapcat程序
该程序将数据库转储到一个LDIF文件。当您创建一个您的数据库的可被人工读取的拷贝时,或者当您想脱机编辑您的数据库时,该程序是非常有用的。该程序这样运行:
slapcat -l -f
[-d ] [-n |-b ]
其中-n和-b参数用来选择由-f参数指定的slapd.conf(5)文件中的配置数据库。相关的LDIF文件输出到标准输出或者输出到使用-l选项指明的文件。
7.3、 LDIF文本条目格式
LDAP数据交换格式,LDIF,被用来使用简单的格式来表示LDAP条目。本部分提供了一个LDIF条目格式的一个简要描述。可以作为ldif(5)和RFC2849的补充。
一个条目的基本格式是:
# comment
dn:
:
:
...
以#开头的行表示注释。一个属性描述可以是一个简单的属性类型,比如cn或者objectClass或者1.2.3(和一个属性类型相关联的OID)或者可以包含选项。比如。Cn;lang_en_us或者userCertificate;binary。
一行的积蓄可以以一个空格或者一个TAB键开始下一行。例如:
dn: cn=Barbara J Jensen,dc=example,dc=
com
cn: Barbara J
Jensen
和:
dn: cn=Barbara J Jensen,dc=example,dc=com
cn: Barbara J Jensen
是相同的。
多个属性值可以在不同的行中指定。比如:
cn: Barbara J Jensen
cn: Babs Jensen
如果一个包含不可打印的字符,或者以一个空格,一个冒号(“:”),或者一个小于号(“<”)开始,后面跟着两个冒号,和其值的BASE64编码。例如,值“ begins with a space”应该被如下编码:
cn:: IGJlZ2lucyB3aXRoIGEgc3BhY2U=
也可以指定一个包含属性值的URL。比如,下面说明了jpegPhoto属性值应该从文件file:///path/to/file.jpeg得到:
cn:< file:///path/to/file.jpeg
一个LDIF文件中的多个条目以空行分隔。下面是一个包含3个条目的LDIF文件的例子:
# Barbara's Entry
dn: cn=Barbara J Jensen,dc=example,dc=com
cn: Barbara J Jensen
cn: Babs Jensen
objectClass: person
sn: Jensen
# Bjorn's Entry
dn: cn=Bjorn J Jensen,dc=example,dc=com
cn: Bjorn J Jensen
cn: Bjorn Jensen
objectClass: person
sn: Jensen
# Base64 encoded JPEG photo
jpegPhoto:: /9j/4AAQSkZJRgABAAAAAQABAAD/2wBDABALD
A4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQ
ERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVG
# Jennifer's Entry
dn: cn=Jennifer J Jensen,dc=example,dc=com
cn: Jennifer J Jensen
cn: Jennifer Jensen
objectClass: person
sn: Jensen
# JPEG photo from file
jpegPhoto:< file:///path/to/file.jpeg
注意,Bjorn条目的jpegPhoto属性是BASE64编码的,Jeniffer条目的jpegPhoto属性则是从URL指定的文件中获取的。
注意:多余的空格在LDIF文件中没有从值中删除。多个中间的空格也没有被压缩。如果你不想让它们出现在数值中,不要将它们留在哪儿。
8、 模式说明
本章描述了如何扩展slapd(8)使用的用户模式。第1个部分,“已发布的模式文件”,详细说明了软件发布版本中提供的可选的模式定义,以及从何处获取其他的定义。第2个部分,“扩展模式”,说明了如何定义新的模式项目。
8.1、 已发布的模式文件
OpenLDAP岁软件发布了一组模式定义,您可以直接使用它们。每一组模式定义为可以被包含到您的slapd.conf(5)中的文件。(可以使用include指令)这些模式文件在正常情况下安装在/usr/local/etc/openldap/schema目录下。
Table 8.1: Provided Schema Specifications |
|
File |
Description |
core.schema |
OpenLDAP core (required) |
cosine.schema |
Cosine and Internet X.500 (useful) |
inetorgperson.schema |
InetOrgPerson (useful) |
misc.schema |
Assorted (experimental) |
nis.schema |
Network Information Services (FYI) |
openldap.schema |
OpenLDAP Project (experimental) |
要使用其中的任何模式文件,只需要在您的slapd.conf(5)文件中的全局定义部分包含需要的文件。比如:
# include schema
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
其他的文件也可以获得。请参考OpenLDAP FAQ(http://www.openldap.org/faq/)。
8.2、 扩展模式
slapd(8)中使用的模式可以被扩展为支持其他的语法,匹配规则,属性类型和对象类。本章详细说明了如何使用slapd已经支持的语法和匹配规则来增加用户应用属性类型和对象属性类型。slapd也可以被扩展为支持其他的语法,匹配规则和系统模式,但是,这需要某种程度的编程,因此,在此处不予讨论。
下面是定义一个新的模式的5个步骤:
¢ 获得对象标识;
¢ 选择一个名称前缀;
¢ 创建本地模式文件;
¢ 定义自定义属性类型;(如果必须)
¢ 定义自定义对象类。
8.2.1、 对象标识
每一个模式元素由一个全局唯一对象标识符(OID)标识。OID同时被用来标识其他的对象。他们通常可以在ASN.1描述的协议中找到。特别是,它们在简单网络管理协议(SNMP)中被广泛使用。因为OID是层次的,您的组织可以获得一个OID,并且在需要的时候对其进行分支扩展。比如,如果您的组织被赋予一个OID1.1,您可以按照如下所示的方法扩展树:
Table 8.2: Example OID hierarchy |
|
OID |
Assignment |
1.1 |
Organization's OID |
1.1.1 |
SNMP Elements |
1.1.2 |
LDAP Elements |
1.1.2.1 |
AttributeTypes |
1.1.2.1.1 |
myAttribute |
1.1.2.2 |
ObjectClasses |
1.1.2.2.1 |
myObjectClass |
您当然可以在您的组织的OID下面自由的根据组织的需要设计您的层次结构。无论您选择了怎样的层次,您应该保持一份分配注册表。这可以是一个简单的平面文件或者是一个更加复杂的东西,比如,OpenLDAP OID Registry(http://www.openldap.org/faq/index.cgi?file=197)。
有关对象标识符(和一个服务列表)的更多信息,请参阅:
http://www.alvestrand.no/harald/objectid/。
任何情况下,您都不应该使用一个伪造的OID!
为了免费得到一个注册过的OID,在Internet Assigned Numbers Authority维护的Private Enterprise arch下申请一个OID。任何私人企业或者组织可以申请一个在此arch下的OID。只需要填写一个位于http://www.iana.org/cgi-bin/enterprise.pl的IANA表单就可以了。您的合法OID将在几天内发送给您。您的基ID将是类似于1.3.6.1.4.1.X,其中X是一个整数。
注意:不要让IANA页面上的“MIB/SNMP”声明混淆您的视线。从这个表单中申请的OID可以用于任何用途,包括标识LDAP模式元素。
8.2.2、 名称前缀
除了给每一个模式元素分配一个唯一的对象标识符,您应该给每一个模式元素提供一个文本名称。该名称应该是既有描述性,又不会和其他的模式名称冲突。特别的,任何您选择的名称都不应该和已经有的或者是将要使用的标准名称冲突。
为了减少(但不是消除)潜在的名称冲突,一个简便的方法是在非标准名称前增加几个字母的前缀,来将组织的改变本地化。组织名称越短,就应该提供越长的前缀。
在下面的示例中,我们选择了一个很短的前缀“my”来减少空间。在一个大型的,全球性的组织中,使用这样短的前缀是不合适的。对于一个小的,本地的公司,我们推荐象“deFirm”(德国公司)或者“comExample”(和example.com关联的组织的元素)。
8.2.3、 本地模式文件
配置文件指令中的objectClass和attibuteTypes可以被用来定义目录中的模式规则。习惯上创建一个文件来包含对于定制的模式元素的定义。我们推荐您在目录/usr/local/etc/openldap/schema/local.schema中创建一个local.schema文件,然后,在您的slapd.conf(5)文件中的其他模式包含指令之后包含该文件。
# include schema
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
# include local schema
include /usr/local/etc/openldap/schema/local.schema
8.2.4、 属性类型说明
指令attributetype被用来定义一个新的属性类型。该指令和在子模式子树中的attributeTypes属性使用相同的属性类型描述(如RFC2252所定义)。比如:
attributetype <RFC2252 Attribute Type Description>
其中,Attribute Type Description按照如下BNF定义:
AttributeTypeDescription = "(" whsp
numericoid whsp ; AttributeType identifier
[ "NAME" qdescrs ] ; name used in AttributeType
[ "DESC" qdstring ] ; description
[ "OBSOLETE" whsp ]
[ "SUP" woid ] ; derived from this other
; AttributeType
[ "EQUALITY" woid ; Matching Rule name
[ "ORDERING" woid ; Matching Rule name
[ "SUBSTR" woid ] ; Matching Rule name
[ "SYNTAX" whsp noidlen whsp ] ; Syntax OID
[ "SINGLE-VALUE" whsp ] ; default multi-valued
[ "COLLECTIVE" whsp ] ; default not collective
[ "NO-USER-MODIFICATION" whsp ]; default user modifiable
[ "USAGE" whsp AttributeUsage ]; default userApplications
whsp ")"
AttributeUsage =
"userApplications" /
"directoryOperation" /
"distributedOperation" / ; DSA-shared
"dSAOperation" ; DSA-specific, value depends on server
其中,whsp是一个空格,numericoid是一个全局唯一的点分十进制格式的OID(例如:1.1.0),qdescrs是一个或者多个名称,woid或者是OID的名称,或者是OID后面加上可选的长度说明(比如:{10})。
例如,属性类型name和cn在core.schema中如下定义:
attributeType ( 2.5.4.41 NAME 'name'
DESC 'name(s) associated with the object'
EQUALITY caseIgnoreMatch
SUBSTR caseIgnoreSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )
attributeType ( 2.5.4.3 NAME ( 'cn' $ 'commonName' )
DESC 'common name(s) assciated with the object'
SUP name )
请注意,每一个都定义了属性的OID,给出了一个短的名称,以及一个简短的描述。每一个名称都是OID的一个别名。Slapd(8)在返回结果的时候,将返回第1个列出的名称。
第1个名称,name,保存了directoryString(UTF-8编码的Unicode)语法。该语法由OID说明。(1.3.6.1.4.1.1466.115.121.1.15标识了目录字符串语法)。还说明了一个推荐长度为32768的选项。服务器应该支持该长度的值,但是,也可以支持更长的值。该域没有指明长度限制,因此,在服务器上被忽略,并且服务器不会限制其大小。另外,相等和子串匹配使用不区分大小写的规则。下面是经常使用的语法和匹配规则(OpenLDAP支持这些,以及更多)
Table 8.3: Commonly Used Syntaxes |
||
Name |
OID |
Description |
boolean |
1.3.6.1.4.1.1466.115.121.1.7 |
boolean value |
distinguishedName |
1.3.6.1.4.1.1466.115.121.1.12 |
DN |
directoryString |
1.3.6.1.4.1.1466.115.121.1.15 |
UTF-8 string |
IA5String |
1.3.6.1.4.1.1466.115.121.1.26 |
ASCII string |
Integer |
1.3.6.1.4.1.1466.115.121.1.27 |
integer |
Name and Optional UID |
1.3.6.1.4.1.1466.115.121.1.34 |
DN plus UID |
Numeric String |
1.3.6.1.4.1.1466.115.121.1.36 |
numeric string |
OID |
1.3.6.1.4.1.1466.115.121.1.38 |
object identifier |
Octet String |
1.3.6.1.4.1.1466.115.121.1.40 |
arbitary octets |
Printable String |
1.3.6.1.4.1.1466.115.121.1.44 |
printable string |
Table 8.4: Commonly Used Matching Rules |
||
Name |
Type |
Description |
booleanMatch |
equality |
boolean |
octetStringMatch |
equality |
octet string |
objectIdentiferMatch |
equality |
OID |
distinguishedNameMatch |
equality |
DN |
uniqueMemberMatch |
equality |
Name with optional UID |
numericStringMatch |
equality |
numerical |
numericStringOrderingMatch |
ordering |
numerical |
numericStringSubstringsMatch |
substrings |
numerical |
caseIgnoreMatch |
equality |
case insensitive, space insensitive |
caseIgnoreOrderingMatch |
ordering |
case insensitive, space insensitive |
caseIgnoreSubstringsMatch |
substrings |
case insensitive, space insensitive |
caseExactMatch |
equality |
case sensitive, space insensitive |
caseExactOrderingMatch |
ordering |
case sensitive, space insensitive |
caseExactSubstringsMatch |
substrings |
case sensitive, space insensitive |
caseIgnoreIA5Match |
equality |
case insensitive, space insensitive |
caseIgnoreIA5OrderingMatch |
ordering |
case insensitive, space insensitive |
caseIgnoreIA5SubstringsMatch |
substrings |
case insensitive, space insensitive |
caseExactIA5Match |
equality |
case sensitive, space insensitive |
caseExactIA5OrderingMatch |
ordering |
case sensitive, space insensitive |
caseExactIA5SubstringsMatch |
substrings |
case sensitive, space insensitive |
第2个属性,cn,是name的一个子类型,因此,它继承了语法,匹配规则,并且使用name.commonName作为别名。
两个属性都没有限制到单一值。都可以被用户应用程序所使用,都不存在过期,都不是集合。
下面的部分给出了几个示例。
8.2.4.1、 myUniqueName
许多组织为每个用户维护了一个单一的唯一名称。虽然可以使用displayName(RFC2798),该属性实际上意味着让用户控制,而不是被组织控制。我们可以简单的从inetorgperson.schema中拷贝displayName的定义,然后替换掉OID,name,以及description。比如:
attributetype ( 1.1.2.1.1 NAME 'myUniqueName'
DESC 'unique name with my organization'
EQUALITY caseIgnoreMatch
SUBSTR caseIgnoreSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
SINGLE-VALUE )
但是,如果我们需要该名字被包含在name声明中[比如,(name=*Jane*)],该属性可以被定义为name的一个子类型。比如:
attributetype ( 1.1.2.1.1 NAME 'myUniqueName'
DESC 'unique name with my organization'
SUP name )
8.2.4.2、 myPhoto
许多组织包含了每一个用户的照片。可以定义一个myPhoto属性类型来保存照片。当然,可以使用jpegPhoto(RFC2798)或者其子类型来保存照片。但是,只有在照片是JPEG格式的情况下才能这样做。作为一种替代方法,可以定义一个使用Octet String语法的属性类型。比如:
attributetype ( 1.1.2.1.2 NAME 'myPhoto'
DESC 'a photo (application defined format)'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.40
SINGLE-VALUE )
这样,该语法没有指明照片的格式。它假设(可能不正确)所有访问该属性的应用统一处理该值。
如果需要支持多种图片格式,应该为每一种格式定义一个另外的属性类型,为照片提供类型信息,或者使用ASN.1描述值,并且使用;binary传输选项。
另外一个选择是让属性保存一个指向图片的URI。可以在labeledURI(RFC2079)之后定义该属性,或者只是简单的创建一个子类型。比如:
attributetype ( 1.1.2.1.3 NAME 'myPhotoURI'
DESC 'URI and optional label referring to a photo'
SUP labeledURI )
8.2.5、 对象类说明
objectclasses指令用来定义一个新的对象类。该指令和在子模式子树中的objectClasses属性使用相同的属性类型描述(如RFC2252所定义)。比如:
objectclass <RFC2252 Object Class Description>
其中,Object Class Description按照如下所示的BNF定义:
ObjectClassDescription = "(" whsp
numericoid whsp ; ObjectClass identifier
[ "NAME" qdescrs ]
[ "DESC" qdstring ]
[ "OBSOLETE" whsp ]
[ "SUP" oids ] ; Superior ObjectClasses
[ ( "ABSTRACT" / "STRUCTURAL" / "AUXILIARY" ) whsp ]
; default structural
[ "MUST" oids ] ; AttributeTypes
[ "MAY" oids ] ; AttributeTypes
whsp ")"
其中,whsp是一个空格,numericoid是一个全局唯一的点分十进制格式的OID(例如:1.1.0),qdescrs是一个或者多个名称,oids是一个或者多个OID的名称。
8.2.5.1、 myPhotoObject
下面定义一个允许将myPhoto增加到任何已经存在的条目中的auxiliary对象类:
objectclass ( 1.1.2.2.1 NAME 'myPhotoObject'
DESC 'mixin myPhoto'
AUXILIARY
MAY myPhoto )
8.2.5.2、 myPerson
如果您的组织需要一个私有的结构化对象类来表示用户,你可以子类化任何一个已经存在的person类,比如inetOrgPerson(RFC2798),然后增加需要的属性:
objectclass ( 1.1.2.2.2 NAME 'myPerson'
DESC 'my person'
SUP inetOrgPerson
MUST ( 'myUniqueName' $ 'givenName' )
MAY 'myPhoto' )
该对象类从inetOrgPerson中继承允许的或者必须的属性,但是,要求myUniqueName和givenName,允许myPhoto。
8.2.6、 OID宏
为了简化OID的管理和使用,slapd(8)支持对象描述宏。objectIdentifier用来将一个宏名连接到一个OID。OID可以是从一个先前已经定义的OID宏中派生的。slapd.conf(5)的语法是:
objectIdentifier { | [:] }
下面显示了定义一组OID宏,并且在定义模式元素中使用它们:
objectIdentifier myOID 1.1
objectIdentifier mySNMP myOrgOID:1
objectIdentifier myLDAP myOrgOID:2
objectIdentifier myAttributeType myOrgLDAP:1
objectIdentifier myObjectClass myOrgLDAP:2
attributetype ( myAttributeType:3 NAME 'myPhotoURI'
DESC 'URI and optional label referring to a photo'
SUP labeledURI )
objectclass ( myObjectClass:1 NAME 'myPhotoObject'
DESC 'mixin myPhoto'
AUXILIARY
MAY myPhoto )