Sun ONE logo     上一章     目录     索引     文档主页     下一章    
Sun ONE Directory Server 管理指南



第 15 章   使用 UID 唯一性插件

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

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

本章包含以下小节:

概述

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

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

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

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

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

实施 uid 属性的唯一性

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

使用控制台配置插件

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

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

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

参数 1:attribute=uid
参数 2:markerObjectClass=baseObjectClass

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

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

参数 3:requiredObjectClass=entryObjectClass

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

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

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

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

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

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

      ldapmodify -h 主机 -p 端口 -D "cn=Directory Manager" -w 口令
      dn:cn=uid uniqueness,cn=plugins,cn=config
      changetype:modify
      add:nsslapd-pluginArg2
      nsslapd-pluginArg2:subtreeBaseDN
      -
      add:nsslapd-pluginArg3
      nsslapd-pluginArg3:subtreeBaseDN
      -
      ...
      ^D

    6. 要根据其基本条目的对象类指定子树,请将参数设置为以下值。将在每个带有 baseObjectClass 的条目下的子树中实施 uid 属性唯一性。可选择性地指定第三个参数中的 entryObjectClass,以便该插件仅在目标条目带有此对象类的操作中实施唯一性。
    7. ldapmodify -h 主机 -p 端口 -D "cn=Directory Manager" -w 口令
      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 主机 -p 端口 -D "cn=Directory Manager" -w 口令
      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.extension
      nsslapd-pluginVersion: 5.2
      nsslapd-pluginVendor:Sun Microsystems, Inc.
      nsslapd-pluginId:NSUniqueAttr
      nsslapd-pluginInitfunc:NSUniqueAttr_Init
      nsslapd-pluginEnabled:state
      ...

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

    3. 如果在服务器中验证插件签名,则新的唯一性插件配置中必须包括该签名。因为您的唯一性插件是 UID 唯一性插件的新实例,所以必须使用相同的签名信息,该签名信息位于以下文件中:
    4. ServerRoot/plugins/signatures/plugin.signatures

      只有安装服务器时使用的用户身份才可以读取该文件(例如,root)。在该文件中,在 dn: cn=uid uniqueness,cn=plugins,cn=config 条目下查找信息。使用该文件中给定的相同值将以下属性添加到新的插件实例中。另外,还必须包括 ds-signedPlugin 对象类:

      objectClass:ds-signedPlugin
      ds-pluginDigest::02Q7yVLYsC8FInPrvbAKYq7Rj0o=
      ds-pluginSignature::MIIBjwYJKoZIhvcNAQcCoIIBgDCCAXwCAQExCzAJBg
       UrDgMCGgUAMAsGCSqGSIb3DQEHATGCAVswggFXAgEBMFYwTTELMAkGA1UEBhMC
       VVMxGTAXBgNVBAoTEFN1biBNaWNyb3N5c3RlbXMxIzAhBgNVBAMTGlBsdWdpbi
       BTaWduaW5nIENlcnRpZmljYXRlAgUA5X1ATjAJBgUrDgMCGgUAoF0wGAYJKoZI
       A2WjAjBgkqhkiG9w0BCQQxFgQU77mUWWJWttkH89eLwTr/fQtz+BswDQYJKoZI
       hvcNAQEBBQAEgYAzZwvgwo+OdKNkXWxlP+pUNpHesL6UQcvXcm37mEQyikRvLs
       hy3X0JutFhEXaCfU4UX76A3Zzedr2Iy0YEGkiPCu3g8jnkFEG/ux0ZMeOPiulF
       f9PUfqpnz6phq19eBZxZ/MBFLxtlzJHG42Ext/un4ZzQIg==
      ...

      有关插件签名的详细信息,请参阅“验证插件签名”。如果不验证插件签名,则无需这些属性。配置将显示未对新的插件实例进行签名,但插件仍会正常运作。

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

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

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

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

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

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

    单主复制方案

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

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

    多主复制方案

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

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

    • 接受唯一性检查的属性是名称属性。
    • 在所有主副本上为相同子树中的相同属性启用唯一性插件。

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


    上一章     目录     索引     文档主页     下一章    
    版权所有 2003 Sun Microsystems, Inc. 保留所有权利。