![]() | |
Sun Java(TM) System Directory Server 5 2004Q2 管理指南 |
第 9 章
扩展目录架构Directory Server 具有标准架构,该架构包括数百个对象类和属性。虽然标准对象类和属性应该能够满足您的大多数要求,但可能还需要创建新对象类和属性以扩展架构。有关标准架构的概述以及有关如何设计能够满足部署要求的架构的说明,请参阅《Directory Server Deployment Planning Guide》中的 Chapter 3 "Directory Server Schema"。
本章在以下小节中介绍如何扩展架构:
架构检查当架构检查处于打开状态时,Directory Server 可确保所有的导入、添加和修改操作符合当前定义的目录架构:
架构检查默认情况下为打开状态,运行 Directory Server 时,架构检查始终应处于打开状态。许多客户机应用程序认为架构检查为打开状态表示所有条目都符合架构。不过,打开架构检查并不会验证目录中的现有内容。要保证所有目录内容符合架构的唯一办法就是在添加任意条目或重新初始化所有条目之前打开架构检查。
唯一的例外情况是加速已知符合架构的 LDIF 文件的导入操作,此时架构检查可能要关闭。不过,始终存在导入不符合架构的条目的风险,并且无法检测到此风险。
当某个条目不符合架构时,将无法搜索到此条目,并且修改此条目的操作也可能会失败。要使条目符合架构,必须执行以下操作:
- 如果服务器处于生产环境,您可能希望首先将整个服务器置于只读状态,以防止架构检查为关闭状态时对其进行任何修改。请参阅“设置全局只读模式”。
- 请按照下面的步骤关闭架构检查。
- 修改条目以使其符合架构。
如果有多个不符合架构的条目,并且这些条目代表了数据的一种模式或新格式,则应改为考虑修改架构。不过,应该在部署前计划架构以尽量减少对架构的更改。有关详细信息,请参阅《Directory Server Deployment Planning Guide》中的 Chapter 3 "Directory Server Schema"。
- 请按照下面的步骤打开架构检查。
- 如果已启用全局只读模式,请取消设置。
使用控制台设置架构检查
从命令行设置架构检查
还可以通过设置 cn=config 条目的 nsslapd-schemacheck 属性来打开和关闭架构检查:
ldapmodify -h host -p port -D "cn=Directory Manager" -w password
dn: cn=config
changetype: modify
replace: nsslapd-schemacheck
nsslapd-schemacheck: on or off
^D服务器将立即实施新架构检查策略。
扩展架构概述向架构添加新属性时,必须创建新对象类以包含这些属性。虽然仅向现有的对象类(已包含所需的大多数属性)添加所需的属性看起来很方便,但这样操作会损坏与 LDAP 客户机的互用性。
Directory Server 与现有 LDAP 客户机的互用性依赖于标准 LDAP 架构。如果更改标准架构,升级服务器时同样会出现困难。基于同样的理由,不能删除标准架构元素。
有关对象类、属性和目录架构的详细信息,以及扩展架构的指导说明,请参阅《Directory Server Deployment Planning Guide》中的 Chapter 3 "Directory Server Schema"。有关标准属性和对象类的信息,请参阅《Directory Server Administration Reference》中的 Chapter 9 "Object Class Reference" 和 Chapter 10 "Attribute Reference"。
Directory Server 架构存储在 cn=schema 条目的属性中。与配置条目相似,这是服务器启动期间从文件读取的架构的 LDAP 视图。架构文件是 LDIF 文件,位于:
ServerRoot/slapd-server ID/config/schema
此目录包含 Directory Server 和其他依赖 Directory Server 的 Sun Java System 服务器所使用的标准架构的文件。《Directory Server Administration Reference》中的 Chapter 5 "Schema Supported by Directory Server 5.2" 对这些文件进行了说明。《Directory Server Administration Reference》中的 Chapter 9 "Object Class Reference" 和 Chapter 10 "Attribute Reference" 对标准架构进行了说明。
修改架构文件
架构文件只能在启动时由服务器读取一次。文件的 LDIF 内容将被添加至 cn=schema 中架构的内存 LDAP 视图。因为架构定义的顺序非常重要,因此架构文件名是以数字作为前缀,并按字母数字顺序加载。只有安装期间定义的系统用户才可以向目录中的架构文件写入。
要修改文件中的架构定义,必须创建或修改希望的文件,然后重新启动服务器。RFC2252 (http://www.ietf.org/rfc/rfc2252.txt) 对架构文件中的语法定义进行了说明。
在 LDIF 文件中直接定义架构时,一定不要使用 X-ORIGIN 字段的值“’user defined’”。此值是为通过 cn=schema 的 LDAP 视图定义且出现在“99user.ldif”文件中的架构元素而保留。
文件 99user.ldif 包含 cn=schema 条目的附加 ACI,以及从命令行或使用控制台添加的所有架构定义。添加新的架构定义时,文件 99user.ldif 将被覆盖。如果要修改此文件,必须立即重新启动服务器以确保所做更改具有永久性。
不应该修改在其他架构文件中定义的标准架构。不过,可以添加新文件以定义新的属性和对象类。例如,要在多台服务器中定义新架构元素,应该在一个名为 98mySchema.ldif 的文件中定义这些架构元素,并将此文件复制到所有服务器的架构目录。然后,必须重新启动所有服务器以加载新的架构文件。
从命令行修改架构
因为架构是由 cn=schema 中的 LDAP 视图定义的,所以可以使用 ldapsearch 和 ldapmodify 公用程序联机查看和修改架构。不过,只能修改 X-ORIGIN 字段的值为 ’user defined’ 的架构元素。服务器将拒绝修改其他定义。
使用 ldapmodify 可以添加和删除 attributeTypes 和 objectClasses 属性的单个值。要修改其中一个值,必须删除该值,然后将其作为新值添加,因为这些属性为多值(请参阅“修改多值属性的一个值”)。必须使用 RFC2252 (http://www.ietf.org/rfc/rfc2252.txt) 中说明的语法来定义架构元素。
任何新元素定义及对用户定义元素的更改都保存在 99user.ldif 文件中。
从命令行修改架构定义很容易出错,因为需要您准确地输入位数多的长值。不过,在需要更新目录架构的脚本中可能会用到此功能。
使用控制台修改架构
定制目录架构的建议方法是使用 Directory Server Console,如以下几节中所述。控制台允许您查看标准架构,并提供一个图形界面,用于定义新的属性和对象类以及编辑已定义的元素。
任何新元素定义及对用户定义元素的更改都保存在 99user.ldif 文件中。
要扩展目录架构,应该按以下顺序执行操作:
管理属性定义Directory Server Console 提供一个界面,以查看架构中的所有属性,并可以创建、编辑和删除您自己的属性定义。
查看属性
要查看有关目录架构中当前存在的所有属性的信息,请执行以下操作:
- 在 Directory Server Console 的顶级“配置”选项卡上,选择配置树中的“架构”节点,然后在右侧面板中选择“属性”选项卡。
该选项卡包含各种表格,这些表格列出架构中的所有标准(只读)属性和用户定义的属性。将鼠标放到表格的某一行,将显示相应属性的说明字符串。
以下表格说明属性表格的字段。
表 9-1 “属性”选项卡中的表格列
列标题
说明
名称
属性的名称,有时称为类型。
OID
属性的对象标识符。OID 是一个字符串(通常由带点的十进制数构成),它唯一标识架构对象。
有关 OID 的详细信息,或者想为企业申请前缀,请向 IANA(Internet 分配号码机构)发邮件,地址是 iana@iana.org;也可访问 IANA Web 站点 http://www.iana.org/。
语法
语法说明允许的属性值格式,可能的语法列在表 9-2 中。
多值
此列中的复选框指定属性是否为多值。多值属性可在条目中出现任意次,但单值属性可能仅出现一次。
表 9-2 属性语法定义
语法名称
定义
二进制(以前的 bin)
表明该属性的值被视作二进制数据。
布尔型
表明该属性仅拥有两个值中的一个:True 或 False。
Country String
表明该属性的值限制为两个字母的国家(地区)代码(由 ISO 3166 指定),例如 FR。
DN(以前的 dn)
表明该属性的值是 DN(标识名称)
DirectoryString(以前的 cis)
表明该属性的值可能包含任意 UTF-8 编码字符,并且不区分大小写。
GeneralizedTime
表明该属性的值已被编码为可印刷的字符串。必须指定时区。强烈建议您使用 GMT。
IA5String(以前的 ces)
表明该属性的值可能仅包含 ASCII 字符的子集,并且区分大小写。
整型(以前的 int)
表明该属性的有效值为数字。
OctetString
和二进制的行为相同。
通讯地址
表明该属性的值被编码为
dstring[$ dstring]*
其中,每个 dstring 组件编码为具有 DirectoryString 语法的值。dstring 中的反斜线符号和美元字符必须加上引号,以免被误认为行分隔符。许多服务器通讯地址限制为 6 行,字符限制上限为 30。例如:
1234 Main St.$Anytown, CA 12345$USA
TelephoneNumber(以前的 tel)
表示该属性的值为电话号码形式。建议使用国际形式的电话号码。
URI
表明该属性的值包含一个 URL(带有一个可选前缀),如 http://、https://、ftp://、ldap:// 或 ldaps://。URI 值的行为与 IA5String 相同(请参阅 RFC2396,http://www.ietf.org/rfc/rfc2396.txt)。
创建属性
要向架构添加您自己的属性定义,请执行以下操作:
- 在 Directory Server Console 的顶级“配置”选项卡上,选择配置树中的“架构”节点,然后在右侧面板中选择“属性”选项卡。
- 单击“创建”以显示“创建属性”对话框。
- 在文本字段中输入以下信息以定义新属性。只有属性名称和语法是必须填写的:
- 属性名称-输入属性的唯一名称,也称为属性类型。属性名称必须以字母开头,并且只能包含 ASCII 字母、数字和连字符。
注
属性名称可以包含大写字母,但没有 LDAP 客户机会依赖这些字母进行识别。必须按照 RFC2251 (http://www.ietf.org/rfc/rfc2251.txt) 4.1.4 小节的说明,以不区分大小写的方式来处理属性名称。
- 属性 OID(可选)-输入属性的对象标识符。在表 9-1 中对 OID 进行了说明。如果不指定 OID,Directory Server 将自动使用 属性名-oid。请注意,为了严格遵从 LDAPv3,必须提供一个有效的数字 OID。
- 属性别名(可选)-在以逗号分隔的列表中输入属性的备用名称。
- 属性说明(可选)-输入简短的说明文字以说明属性的用途。
- 语法-从下拉列表中选择一个说明属性所要包含数据的语法。在表 9-2 中对可供使用的语法进行了说明。
- 多值-默认情况下,属性为多值。如果属性的每个条目只能有一个值,则请取消选中该复选框。
- 在“创建属性”对话框中单击“确定”以定义新属性。该属性将出现在用户定义属性的表格中。
在目录条目中定义该属性的值之前,必须创建或编辑需要或允许此属性的对象类,如“管理对象类定义”中所述。
编辑属性
使用控制台只能编辑用户定义的属性。在修改属性的名称、语法或多值定义之前,必须确保目录中的条目当前未使用此属性,否则客户机将不能访问该条目。
要修改属性的架构定义,请执行以下操作:
删除属性
使用控制台只能删除用户定义的属性。在删除属性定义之前,必须确保目录中的条目当前未使用此属性,否则客户机将不能访问该条目。
要删除属性的架构定义,请执行以下操作:
管理对象类定义Directory Server Console 还提供一个界面,可以查看架构中的所有对象类,并可以创建、编辑和删除您自己的对象类定义。
查看对象类
要查看有关当前所有已定义的对象类的信息,请执行以下操作:
- 在 Directory Server Console 的顶级“配置”选项卡上,选择配置树中的“架构”节点,然后在右侧面板中选择“对象类”选项卡。
该选项卡包含的列表列出了架构中的所有标准(只读)对象类和用户定义的对象类。
- 选择要在任一列表中查看的对象类。
此选项卡中的其他字段显示了有关所选对象类的以下信息:
表 9-3 “对象类”选项卡的字段
字段
说明
必需的属性
包含必须出现在使用该对象类的条目中的一组属性。该列表包括继承的属性。
允许的属性
包含可能出现于使用该对象类的条目中的一组属性。该列表包括继承的属性。
父对象类
父对象类标识对象类从中继承其属性和结构的对象类。对象类自动从其父对象类继承必需属性和允许属性。
OID
对象类的对象标识符。OID 是一个字符串(通常由带点的十进制数构成),它唯一标识架构对象。
有关 OID 的详细信息,或者想为企业申请前缀,请向 IANA(Internet 分配号码机构)发邮件,地址是 iana@iana.org;也可访问 IANA Web 站点 http://www.iana.org/。
创建对象类
如果要创建互相继承的若干对象类,必须首先创建父对象类。如果新对象类要使用自定义属性,还必须首先定义这些自定义属性。
要向架构添加您自己的对象类定义,请执行以下操作:
- 在 Directory Server Console 的顶级“配置”选项卡上,选择配置树中的“架构”节点,然后在右侧面板中选择“对象类”选项卡。
- 单击“创建”以显示“创建对象类”对话框。
- 在文本字段中输入以下信息,以定义新对象类:
- 名称-输入对象类的唯一名称。
- 父对象类-选择要作为父对象类的现有对象类。默认情况下,将选定 top 且必须用作父对象类(如果对象类没有从其他任何对象类继承)。从父对象类中继承的必需属性和允许属性及其父对象类将显示在相应的列表中。
通常,如果要添加用户条目的新属性,则父对象类将是 inetOrgPerson 对象类。如果要添加公司条目的新属性,父对象类通常为 organization 或 organizationalUnit。如果要添加组条目的新属性,父对象类通常为 groupOfNames 或 groupOfUniqueNames。
- OID(可选)-输入对象类的对象标识符。在表 9-3 中对 OID 进行了说明。如果不指定 OID,Directory Server 将自动使用 对象类名-oid。请注意,为了严格遵从 LDAPv3,必须提供一个有效的数字 OID。
- 定义使用新对象类的条目要包含的属性:
- 在“创建对象类”对话框中单击“确定”以定义新对象类。新对象类将出现在用户定义的对象类表格中,现在您可以定义具有此对象类的条目。
编辑对象类
使用控制台只能编辑用户定义的对象类。在修改对象类的定义之前,必须确保目录中当前没有使用此对象类的条目,否则客户机将不能访问该条目。
要修改对象类的架构定义,请执行以下操作:
删除对象类
使用控制台只能删除用户定义的对象类。在删除对象类定义之前,必须确保目录中当前没有使用此对象类的条目,否则客户机将不能访问该条目。
要删除对象类的架构定义,请执行以下操作:
复制架构定义不论何时配置两个服务器间一个或多个后缀的复制,也将自动复制架构。这将确保所有副本都有一个完整、相同的架构,此架构定义可能复制到使用者的所有对象类和属性。因此,主副本服务器也包含主架构。
要在所有副本上实施架构,必须在所有的主副本上启用架构检查。因为在执行 LDAP 操作的主副本上执行架构检查,所以更新使用者副本时不需要检查架构。为提高性能,复制机制将避开对使用者副本进行架构检查。
使用者初始化期间以及不论何时通过控制台或命令行工具修改架构,主副本服务器会将架构自动复制到其使用者。默认情况下将复制整个架构,并且创建使用者中还不存在的任何其他架构元素,并将其存储在 99user.ldif 文件中。
例如,假设启动时主副本服务器在 98mySchema.ldif 文件中包含架构定义,然后您定义了与其他服务器(可能为主副本服务器、集线器服务器或专门使用者服务器)之间的复制协议。随后从主副本服务器中初始化副本时,已复制的架构将包含 98mySchema.ldif 中的定义,但它们将存储在副本服务器的 99user.ldif 中。
使用者初始化期间复制架构后,在主副本的 cn=schema 中修改架构也会将整个架构复制到使用者。因此,通过命令行公用程序或控制台对主副本架构所作的任何修改都将被复制到使用者副本。这些修改将被存储在主副本的 99user.ldif 中,通过上面所述的相同机制,这些修改也将被存储在使用者副本的 99user.ldif 中。
修改已复制的架构文件
复制机制无法检测到对包含架构的 LDIF 文件直接进行的任何更改。因此,如果按照“修改架构文件”中的说明更新架构,即使重新启动主副本服务器后,所作的更改也不会复制到使用者副本中。
Directory Server 5.2 提供了以下脚本,用来将架构文件中的更改“推送”至使用者副本:
请使用以下步骤在主副本服务器上修改架构文件:
- 在架构目录中添加新架构文件或修改现有架构文件:
ServerRoot/slapd-server ID/config/schema
只有安装期间定义的系统用户才可以向目录中的架构文件写入。有关详细信息,请参阅“修改架构文件”。
- 如上所述运行 schema_push.pl 脚本。该脚本并不是真的向副本“推送”架构,而是将一个特殊属性写入架构文件,这样一旦加载架构文件,即会对其进行复制。
- 重新启动服务器。服务器将加载所有架构文件,复制机制会将新架构复制到其使用者副本。
限制架构复制
默认情况下,不论何时复制机制复制架构,都会将整个架构发送至使用者副本。有两种情况不希望出现上述情形:
使用以下命令来限制架构复制,从而仅复制用户定义的架构:
ldapmodify -h host -p port -D "cn=Directory Manager" -w password
dn: cn=config
changetype: modify
replace: nsslapd-schema-repl-useronly
nsslapd-schema-repl-useronly: on
^D如果需要,off 的默认值将使整个架构被复制。