由于所有配置信息和模板数据都作为条目存储在目录中,因此可以使用 LDAP 命令行工具配置和管理 CoS 定义。本部分说明如何从命令行创建 CoS 定义条目和 CoS 模板条目。
所有 CoS 定义条目都具有 LDAPsubentry 对象类,并且是从 cosSuperDefinition 对象类继承来的。此外,每种类型的 CoS 都从特定对象类继承而来,并包含相应属性。下表列出了与每种类型的 CoS 定义条目相关联的对象类和属性。
表 10–1 CoS 定义条目中的对象类和属性
CoS 类型 |
CoS 定义条目 |
---|---|
指针 CoS |
objectclass: top objectclass: LDAPsubentry objectclass: cosSuperDefinition objectclass: cosPointerDefinition cosTemplateDN: DN cosAttribute: attributeName override merge |
间接 CoS |
objectclass: top objectclass: LDAPsubentry objectclass: cosSuperDefinition objectclass: cosIndirectDefinition cosIndirectSpecifier: attributeName cosAttribute: attributeName override merge |
传统 CoS |
objectclass: top objectclass: LDAPsubentry objectclass: cosSuperDefinition objectclass: cosClassicDefinition cosTemplateDN: DN cosSpecifier: attributeName cosAttribute: attributeName override merge |
cosAttribute 始终为多值属性。每个值都定义一个由 CoS 机制生成的属性。
可以在 CoS 定义条目中使用以下属性。有关其中每个属性的详细信息,请参见《Sun Java System Directory Server Enterprise Edition 6.3 Man Page Reference》中的各个属性。
表 10–2 CoS 定义条目属性
属性 |
在 CoS 定义条目中的用途 |
---|---|
cosAttribute attributeName override merge |
定义要生成值的已计算属性的名称。此属性为多值属性,每个值代表将通过模板生成值的属性的名称。override 和 merge 限定符指定在此表后面所述的特殊情况下如何计算 CoS 属性值。 attributeName 不能包含任何子类型。带有子类型的属性名称将被忽略,但会处理 cosAttribute 的其他值。 |
cosIndirectSpecifier attributeName |
定义目标条目中属性的名称,间接 CoS 将使用此属性的值标识模板条目。已命名的属性称为说明符,并且必须包含每个目标条目中的完整 DN 字符串。此属性为单值属性,但 attributeName 可以是多值属性,以指定多个模板。 |
cosSpecifier attributeName |
定义目标条目中属性的名称,传统 CoS 将使用此属性的值标识模板条目。已命名的属性称为说明符,并且必须包含可以在模板条目 RDN 中找到的字符串。此属性为单值属性,但 attributeName 可以是多值属性,以指定多个模板。 |
cosTemplateDN DN |
提供模板条目的完整 DN(对于指针 CoS 定义)或基 DN(对于传统 CoS)。此属性为单值属性。 |
无法通过将 isMemberOf 属性用作 CosSpecifier,来使静态组的所有成员自动继承公用的已计算属性值。
cosAttribute 属性允许 CoS 属性名称后面有两个限定符,即 override 限定符和 merge 限定符。
override 限定符描述当条目中已实际存在 CoS 动态生成属性时的行为。override 可为以下任一选项:
default(或无限定符)- 表示当属性类型与已计算属性相同时,服务器不会覆盖条目中存储的实际属性值。
operational - 表示只有在搜索中明确请求时才会返回属性。操作属性不必通过模式检查即可返回。operational 限定符与 override 限定符具有相同的行为。
只有在模式中也将某个属性定义为操作属性时,该属性才能成为操作属性。例如,如果 CoS 生成一个 description 属性值,则无法使用 operational 限定符,因为 description 属性在模式中未标记为操作属性。
merge 限定符要么不使用,要么为 merge-schemes 形式。此限定符允许 CoS 已计算属性成为多值属性,这些值可以来自多个模板或多个 CoS 定义 。有关详细信息,请参见多值 CoS 属性。
可以创建包含 override 限定符的指针 CoS 定义条目,如下所示:
dn: cn=pointerCoS,dc=example,dc=com objectclass: top objectclass: LDAPsubentry objectclass: cosSuperDefinition objectclass: cosPointerDefinition cosTemplateDn: cn=exampleUS,cn=data cosAttribute: postalCode override |
此指针 CoS 定义条目表示条目与生成 postalCode 属性值的模板条目 cn=exampleUS,cn=data 相关联。override 限定符表示此值优先于 postalCode 属性值(如果目标条目中存在该属性)。
如果 CoS 属性是使用 operational 或 override 限定符定义的,则无法对 CoS 范围内任何条目中的“实际”属性值执行写入操作。
指定 merge-schemes 限定符时,CoS 已生成属性在以下两种情况下可以成为多值属性:
使用间接或传统 CoS 时,目标条目中的说明符属性可以为多值属性。在这种情况下,每个值都确定一个模板,并且每个模板中的值都是生成值的一部分。
多个任意类型的 CoS 定义条目可以在 cosAttribute 中包含相同的属性名称。在这种情况下,如果所有定义都包含 merge-schemes 限定符,则生成的属性将包含由每个定义计算的所有值。
这两种情况可以同时发生,并定义更多的值。但是,重复的值只会在生成的属性中返回一次。
如果不使用 merge-schemes 限定符,模板条目的 cosPriority 属性将用于确定已生成属性在所有模板中的单一值。下一部分将介绍此方案。
merge-schemes 限定符永远不会将目标中定义的“实际”值与通过模板生成的值进行合并。merge 限定符独立于 override 限定符。所有配对情况都可能出现,并且每种情况表示的行为是互补的。 此外,还可以在属性名称后按任意顺序指定这些限定符。
如果同一属性具有多个 CoS 定义,则这些定义必须具有相同的 override 和 merge 限定符。如果 CoS 定义中存在不同的限定符对,将从所有定义中任意选择一种组合。
如果存在多个 CoS 定义或多值说明符,但未使用 merge-schemes 限定符,目录服务器将使用优先级属性选择用于定义已计算属性单一值的单一模板。
cosPriority 属性表示纳入考虑的所有模板中某一特定模板的全局优先级。优先级为零代表最高优先级。不包含 cosPriority 属性的模板被视为优先级最低。如果两个或两个以上的模板提供一个属性值,但却具有相同的优先级或没有优先级,此时将任意选择一个值。
使用 merge-schemes 限定符时不会考虑模板优先级。在合并时,纳入考虑的所有模板将定义一个值,而不管这些模板定义的优先级如何。cosPriority 属性是在 CoS 模板条目上定义的,如以下部分所述。
cosPriority 属性不能具有负值。此外,由间接 CoS 生成的属性不支持优先级。不要在间接 CoS 定义的模板条目中使用 cosPriority。
使用指针 CoS 或传统 CoS 时,模板条目包含 LDAPsubentry 和 cosTemplate 对象类。必须专门为 CoS 定义创建此条目。如果将 CoS 模板条目作为 LDAPsubentry 对象类的实例,可以不受配置条目的限制而执行一般搜索。
间接 CoS 机制的模板是目录中任意的现有条目。不必提前对目标进行标识或为其提供 LDAPsubentry 对象类,但目标必须具有辅助 cosTemplate 对象类。只有将 CoS 评估为生成已计算属性及其值时,才会访问间接 CoS 模板。
CoS 模板条目必须始终包含 CoS 在目标条目上生成的属性和值。属性名称在 CoS 定义条目的 cosAttribute 属性中指定。
以下示例显示了指针 CoS(生成 postalCode 属性)最高优先级的模板条目:
dn: cn=ZipTemplate,ou=People,dc=example,dc=com objectclass: top objectclass: LDAPsubentry objectclass: extensibleobject objectclass: cosTemplate postalCode: 95054 cosPriority: 0 |
以下部分提供了模板条目示例以及每种类型的 CoS 定义条目示例。
以下命令创建一个指针 CoS 定义条目,它具有 cosPointerDefinition 对象类。此定义条目使用在上一部分示例中介绍的 CoS 模板条目,以便在 ou=People,dc=example,dc=com 树的所有条目之间共享公用的邮政编码。
$ ldapmodify -a -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - dn: cn=pointerCoS,ou=People,dc=example,dc=com objectclass: top objectclass: LDAPsubentry objectclass: cosSuperDefinition objectclass: cosPointerDefinition cosTemplateDn: cn=ZipTemplate,ou=People,dc=example,dc=com cosAttribute: postalCode |
CoS 模板条目 (cn=ZipTemplate,ou=People,dc=example,dc=com ) 可将 postalCode 属性中存储的值提供给位于 ou=People,dc=example,dc=com 后缀下的所有条目。如果在同一子树中搜索没有邮政编码的任何条目,您将会看到已生成属性的值:
$ ldapsearch -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - \ -b "ou=People,dc=example,dc=com" -s sub "(cn=*Jensen)" dn: cn=Babs Jensen,ou=People,dc=example,dc=com cn: Babs Jensen ... postalCode: 95054 |
间接 CoS 命名 cosIndirectSpecifier 属性中的某个属性,以查找特定于每个目标的模板。间接 CoS 的模板条目可以是目录中的任何条目,包括其他用户条目。此间接 CoS 示例使用目标条目的 manager 属性标识 CoS 模板条目。模板条目是经理的用户条目。经理的用户条目包含要生成的属性的值。在本案例中,该值为 departmentNumber 的值。
以下命令将创建间接 CoS 定义条目,此条目包含 cosIndirectDefinition 对象类:
$ ldapmodify -a -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - dn: cn=generateDeptNum,ou=People,dc=example,dc=com objectclass: top objectclass: LDAPsubentry objectclass: cosSuperDefinition objectclass: cosIndirectDefinition cosIndirectSpecifier: manager cosAttribute: departmentNumber |
接下来,将 cosTemplate 对象类添加到模板条目,并确保这些条目定义要生成的属性。在此示例中,所有经理条目都是模板:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - dn: cn=Carla Fuentes,ou=People,dc=example,dc=com changetype: modify add: objectclass objectclass: cosTemplate - add: departmentNumber departmentNumber: 318842 |
使用此 CoS,包含 manager 属性的目标条目(位于 ou=People,dc=example,dc=com 下的条目)将自动包含经理的部门编号。将在目标条目上计算 departmentNumber 属性,因为服务器中不存在该属性。但是,departmentNumber 属性将作为目标条目的一部分返回。例如,如果将 Babs Jensen 的经理定义为 Carla Fuentes,其部门编号如下所示:
$ ldapsearch -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - \ -b "ou=People,dc=example,dc=com" -s sub "(cn=*Jensen)" dn: cn=Babs Jensen,ou=People,dc=example,dc=com cn: Babs Jensen ... manager: cn=Carla Fuentes,ou=People,dc=example,dc=com departmentNumber: 318842 |
此示例说明如何使用传统 CoS 生成邮政地址。生成的值是在模板条目中指定的,该模板条目的位置由 CoS 定义中的 cosTemplateDN 和目标条目中的 cosSpecifier 属性值共同确定。以下命令使用 cosClassicDefinition 对象类创建定义条目:
$ ldapmodify -a -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - dn: cn=classicCoS,dc=example,dc=com objectclass: top objectclass: LDAPsubentry objectclass: cosSuperDefinition objectclass: cosClassicDefinition cosTemplateDn: ou=People,dc=example,dc=com cosSpecifier: building cosAttribute: postalAddress |
使用相同的命令,可以创建提供每栋大楼邮政地址的模板条目:
dn: cn=B07,ou=People,dc=example,dc=com objectclass: top objectclass: LDAPsubentry objectclass: extensibleobject objectclass: cosTemplate postalAddres: 7 Old Oak Street, Anytown, CA 95054 |
使用此 CoS,包含 building 属性的目标条目(位于 ou=People,dc=example,dc=com 下的条目)将自动包含相应的邮政地址。CoS 机制将搜索在 RDN 中具有说明符属性值的模板条目。在此示例中,如果将 Babs Jensen 分配到大楼 B07,则生成的通讯地址如下:
$ ldapsearch -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - \ -b "ou=People,dc=example,dc=com" -s sub "(cn=*Jensen)" dn: cn=Babs Jensen,ou=People,dc=example,dc=com cn: Babs Jensen ... building: B07 postalAddress: 7 Old Oak Street, Anytown, CA 95054 |