Sun Java 徽标     上一章      目录      索引      下一章     

Sun 徽标
Sun Java(TM) System Directory Server 5 2004Q2 管理指南 

第 15 章
实施属性值唯一性

UID 唯一性插件确保给定属性的值在目录或子树的所有条目中都具有唯一性。该插件将停止任何试图添加包含给定属性现有值的条目的操作,或者将属性添加或修改为目录中已有值的任何操作。

默认情况下,禁用 UID 唯一性插件。默认情况下,启用它后,它可以确保 uid 属性的唯一性。可以创建该插件的新实例,以强制其他属性具有唯一值。UID 唯一性插件限于保证单个服务器上的属性值具有唯一性。

本章包含以下小节:


概述

UID 唯一性插件是预运行插件。它在服务器执行目录更新前检查所有 LDAP 操作。该插件确定操作是否将导致两个条目具有相同的属性值,在这种情况下,服务器终止操作并向客户机返回错误 19,LDAP_CONSTRAINT_VIOLATION

可以对该插件进行配置,以便强制要求在目录中的一个或多个子树中具有唯一性,或在特定对象类的条目间具有唯一性。该配置确定将实施唯一属性值的条目集。只有在操作的对象是该集中的条目且属性值在该集的所有条目中不具有唯一性时,操作才能终止。

如果希望强制其他属性具有唯一性,则可定义 UID 唯一性插件的多个实例。为其值必须唯一的每个条目集和属性定义一个插件实例。还可以具有同一属性的多个插件实例,以强制在多个条目集中具有单独的唯一性。仅允许给定的属性值在每个条目集中出现一次。

在现有目录上启用属性唯一性时,服务器不检查现有条目间的唯一性。只有当添加条目或者添加或修改属性时,才会强制实施唯一性。

默认情况下,将禁用 UID 唯一性插件,因为它影响多主复制操作。使用复制时,可以启用 UID 唯一性插件,但是您应当知道“同时使用唯一性插件和复制”中说明的行为。


实施 uid 属性的唯一性

本节介绍如何启用和配置 uid 属性的默认唯一性插件。要实施其他属性的唯一性,请参阅“实施其他属性的唯一性”

使用控制台配置插件

使用控制台时,一定不要修改默认的 uid 唯一性插件以实施其他属性的唯一性。如果不希望有 uid 唯一性插件,请禁用它并创建其他属性的新插件实例,如“实施其他属性的唯一性”中所述。

  1. 在 Directory Server Console 的顶级“配置”选项卡上,展开“插件”节点,并选择 uid uniqueness 插件。
  2. 在右侧面板中,选中复选框以启用该插件。
  3. 不要修改初始化函数字段或插件模块路径。

  4. 根据对实施唯一性子树的指定方式,修改插件参数:
    • 要指定单个子树的基准 DN,请编辑参数2 的值。要指定多个子树,请单击添加以添加更多参数,并在每个新的文本字段中输入子树的基准 DN。
    • 要通过其基本条目的对象类指定子树,请将参数设置为以下值:
    • Argument 1: attribute=uid
      Argument 2: markerObjectClass=baseObjectClass

      该插件将在带有给定 baseObjectClass 的目录中的每个条目下的子树中实施 uid 唯一性。例如,如果在诸如 ou=Employeesou=Contractors 的许多分支中都具有用户条目,则指定 markerObjectClass=organizationalUnit

      因为标记对象类下的分支范围可能非常广,所以可根据条目的对象类,进一步将属性唯一性的实施限制到某些条目。单击“添加”,添加第三方插件参数,并将其设置为以下值:

      Argument 3: requiredObjectClass=entryObjectClass

      在带有 baseObjectClass 的条目的子树内部,该插件将仅在带有 entryObjectClass 的目标条目的操作中实施唯一性。例如,如果拥有传统用户条目,则指定 requiredObjectClass=inetorgperson

  5. 完成对 uid 唯一性插件的编辑后,单击“保存”。将会提醒您必须重新启动服务器,更改才能生效。
  6. 重新启动服务器,开始实施 uid 属性的唯一值。

从命令行配置插件

以下过程说明如何使用 ldapmodify 命令启用和配置 uid 唯一性插件。该插件配置条目的 DN 是 cn=uid uniqueness,cn=plugins,cn=config

  1. 通过将 nsslapd-pluginEnabled 属性设置分别为 onoff,启用或禁用该插件:
  2. ldapmodify -h host -p port -D "cn=Directory Manager" -w password
    dn: cn=uid uniqueness,cn=plugins,cn=config
    changetype: modify
    replace: nsslapd-pluginEnabled
    nsslapd-pluginEnabled: on or off
    ^D

  3. 根据对实施唯一性子树的指定方式,修改插件参数:
  4. 要指定单个子树的基准 DN,请修改 nsslapd-pluginarg1 的值:
  5. ldapmodify -h host -p port -D "cn=Directory Manager" -w password
    dn: cn=uid uniqueness,cn=plugins,cn=config
    changetype: modify
    replace: nsslapd-pluginArg1
    nsslapd-pluginArg1: subtreeBaseDN
    ^D

    要指定多个子树,请添加更多参数,每个参数的值为子树的完整基准 DN:

    ldapmodify -h host -p port -D "cn=Directory Manager" -w password
    dn: cn=uid uniqueness,cn=plugins,cn=config
    changetype: modify
    add: nsslapd-pluginArg2
    nsslapd-pluginArg2: subtreeBaseDN
    -
    add: nsslapd-pluginArg3
    nsslapd-pluginArg3: subtreeBaseDN
    -
    ...
    ^D

  6. 要根据其基本条目的对象类指定子树,请将参数设置为以下值。将在每个带有 基本对象类 的条目下的子树中实施 uid 属性唯一性。可选择性地指定第三个参数中的 条目对象类,以便该插件仅在目标条目带有此对象类的操作中实施唯一性。
  7. ldapmodify -h host -p port -D "cn=Directory Manager" -w password
    dn: cn=uid uniqueness,cn=plugins,cn=config
    changetype: modify
    replace: nsslapd-pluginArg0
    nsslapd-pluginArg0: attribute=uid
    -
    replace: nsslapd-pluginArg1
    nsslapd-pluginArg1: markerObjectClass=baseObjectClass
    -
    replace: nsslapd-pluginArg2
    nsslapd-pluginArg2: requiredObjectClass=entryObjectClass
    ^D

  8. 重新启动服务器,以使更改生效。


实施其他属性的唯一性

UID 唯一性插件可用于实施任何属性的唯一性。必须在目录中 cn=plugins,cn=config 下创建新条目,从而创建该插件的新实例。

  1. 使用 ldapmodify 命令添加新插件实例的配置条目。该命令的第一部分显示如下。该命令的其余部分显示在以下步骤中。
  2. ldapmodify -a -h host -p port -D "cn=Directory Manager" -w password
    dn: cn=plug-in_name,cn=plugins,cn=config
    objectClass: top
    objectClass: nsSlapdPlugin
    objectClass: extensibleObject
    cn: plug-in_name
    nsslapd-pluginDescription: Enforce unique attribute values
    nsslapd-pluginType: preoperation
    nsslapd-plugin-depends-on-type: database
    nsslapd-pluginPath: ServerRoot/lib/uid-plugin.so
    nsslapd-pluginVersion: 5.2
    nsslapd-pluginVendor: Sun Microsystems, Inc.
    nsslapd-pluginId: NSUniqueAttr
    nsslapd-pluginInitfunc: NSUniqueAttr_Init
    nsslapd-pluginEnabled: on or off
    ...
    ^D

    在该命令的第一部分中,plug-in_name 应当是包含属性名的简短描述性名称(例如,cn=mail uniqueness)。在服务器重新启动时,指定启用的新实例的状态为 onoff

  3. 命令的其余部分指定插件参数,这些参数取决于被实施唯一性的子树的确定方式。
  4. 要根据其基本 DN 定义一个或多个子树,第一个参数必须是拥有唯一值的属性名称,随后的参数是子树基本条目的完整 DN。
  5. nsslapd-pluginarg0: attribute_name
    nsslapd-pluginarg1: subtreeBaseDN
    nsslapd-pluginarg2: subtreeBaseDN
    ...
    ^D

  6. 要根据其基本条目的对象类定义子树,第一个参数必须包含 attribute=attribute_name 以指定应具有唯一值的属性的名称。第二个参数必须是 baseObjectClass,它确定被实施唯一性的子树的基本条目。可选择性地指定第三个参数中的 entryObjectClass,以便该插件仅在目标条目带有该对象类的操作中实施唯一性。
  7. nsslapd-pluginarg0: attribute=attribute_name
    nsslapd-pluginarg1: markerObjectClass=baseObjectClass
    nsslapd-pluginarg2: requiredObjectClass=entryObjectClass
    ^D

    在所有插件参数中,符号前后一定没有空白区域。

  8. 重新启动服务器,将新的唯一性插件实例载入服务器中。


同时使用唯一性插件和复制

将更新作为复制操作的一部分来执行时,UID 唯一性插件不对属性值执行任何检查。这不影响单主复制,但该插件不能自动对多主复制实施属性唯一性。

单主复制方案

因为客户机应用程序所做的所有修改都在主副本上执行,所以应在主服务器上启用 UID 唯一性插件。应将该插件配置为在复制的后缀中实施唯一性。因为主副本可确保期望的属性值具有唯一性,所以不必在使用者服务器上启用该插件。

在单主机的使用者上启用 UID 唯一性插件将不会妨碍复制或正常的服务器操作,但可能会导致性能轻微下降。

多主复制方案

UID 唯一性插件并非设计为用于多主复制方案中。因为多主复制使用不严格的一致性复制模型,所以即使在两个服务器上启用了该插件,也无法检测出在两个服务器上同时添加的同一属性值。

但是,可以在下列条件下使用 UID 唯一性插件:

满足这些条件时,唯一性冲突会在复制时报告为命名冲突。命名冲突需要手动解决。有关解决复制冲突的信息,请参阅“解决常见复制冲突”



上一章      目录      索引      下一章     


版权所有 2004 Sun Microsystems, Inc. 保留所有权利。