Sun Java System Directory Server Enterprise Edition 6.3 管理指南

第 14 章 目录服务器属性值唯一性

UID 唯一性插件可确保给定属性的值在目录或子树的所有条目中是唯一的。如果某个操作尝试添加包含给定属性现有值的条目,此插件将会停止该操作。如果某个操作添加目录中已存在的值,或者将属性值修改为目录中已存在的值,此插件也会停止该操作。

默认情况下将禁用 UID 唯一性插件。启用此插件时,默认情况下可确保 uid 属性的唯一性。您可以创建此插件的新实例,以便在其他属性上实现属性值唯一性。UID 唯一性插件可确保单个服务器上的属性值唯一性。

本章包含以下主题:

属性值唯一性概述

UID 唯一性插件是预操作插件。在服务器执行目录更新之前,它将检查 LDAP 添加、修改和修改 DN 操作。此插件可确定操作是否会导致两个条目具有相同的属性值。如果相同,服务器将终止此操作,并向客户端返回错误 19 LDAP_CONSTRAINT_VIOLATION

可以对此插件进行配置,以便在目录的一个或多个子树中或特定对象类的条目之间实现唯一性。此配置可确定要实现属性值唯一性的条目集。

如果要实现其他属性的唯一性,则可以定义多个 UID 唯一性插件的实例。请为每个必须具有唯一值的属性定义一个插件实例。还可以为同一属性定义多个插件实例,以便在多个条目集中“分别”实现唯一性。给定的属性值在每个子树集中只允许一次。

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

默认情况下将禁用 UID 唯一性插件,因为此插件会影响多主复制。使用复制时可以启用 UID 唯一性插件,但您应该了解将唯一性插件用于复制中描述的内容。

实现 uid 和其他属性的唯一性

部分说明如何为 uid 属性启用和配置默认唯一性插件,以及如何实现任何其他属性的唯一性。

Procedure实现 uid 属性的唯一性

此过程说明如何使用 dsconf 命令启用和配置 UID 唯一性插件。此插件配置条目的 DN 为 cn=uid uniqueness,cn=plugins,cn=config

可使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。

使用 DSCC 时,不得修改默认的 UID 唯一性插件以实现其他属性的唯一性。如果不需要使用 UID 唯一性插件,请将此插件保留为禁用状态,并为其他属性创建新的插件实例,如实现其他属性的唯一性所述。

  1. 启用插件。


    $ dsconf enable-plugin -h host -p port "uid uniqueness"
  2. 根据要实现唯一性的子树的指定方式,修改插件参数。

    • 要指定单个子树的基 DN,请键入:


      $ dsconf set-plugin-prop -h host -p port "uid uniqueness" argument:uid argument:subtreeBaseDN
      

      例如:


      $ dsconf set-plugin-prop -h host1 -p 1389 "uid uniqueness" argument:uid \
       argument:dc=People,dc=example,dc=com
    • 要指定多个子树,请添加更多的参数,并将子树的完整基 DN 作为每个参数的值。


      $ dsconf set-plugin-prop -h host -p port "uid uniqueness" argument:uid \
       argument:subtreeBaseDN argument:subtreeBaseDN
      
    • 要根据子树基条目的对象类指定这些子树,请将参数设置为以下值。将在每个具有 baseObjectClass 的条目下的子树中实现 uid 属性唯一性。也可以选择在第三个参数中指定 entryObjectClass,以便插件只在特定操作(以具有此对象类的条目为目标)中实现唯一性。


      $ dsconf set-plugin-prop -h host -p port "uid uniqueness" argument:attribute=uid \
       argument:markerObjectClass=baseObjectClass argument:entryObjectClass=baseObjectClass
      
    • 要在现有参数列表中添加参数,请使用以下命令:


      $ dsconf set-plugin-prop -h host -p port "uid uniqueness" argument+:argument-value
      
  3. 重新启动服务器以使更改生效。

Procedure实现其他属性的唯一性

UID 唯一性插件可用于实现任何属性的唯一性。您必须在目录的 cn=plugins,cn=config 下创建新条目,以创建此插件的新实例。

无法使用 DSCC 执行此任务。请使用命令行,如以下过程所述。

  1. 创建新插件。


    $ dsconf create-plugin -h host -p port -H lib-path -F init-func \
     -Y type plugin-name 
    

    plugin-name 应该是简短的描述性名称,其中包含属性名称。例如,要创建一个插件以实现邮件 ID 属性的唯一性,请使用以下命令:


    $ dsconf create-plugin -h host1 -p 1389 -H /opt/SUNWdsee/ds6/lib/uid-plugin.so \
     -F NSUniqueAttr_Init -Y preoperation "mail uniqueness"
  2. 设置插件属性。


    $ dsconf set-plugin-prop -h host -p port plugin-name property:value
    

    例如,要设置邮件唯一性插件的属性,请使用以下命令:


    $ dsconf set-plugin-prop -h host1 -p 1389 "mail uniqueness" \
     desc:"Enforce unique attribute values..." version:6.0 \
     vendor:"Sun Microsystems, Inc." depends-on-type:database
  3. 启用插件。


    $ dsconf enable-plugin -h host -p port plugin-name
    
  4. 指定插件参数。

    这些参数取决于要实现唯一性的子树的确定方式。

    • 要根据子树的基 DN 定义一个或多个子树,则第一个参数必须是应具有唯一值的属性的名称。后面的参数是这些子树基条目的完整 DN。


      $ dsconf set-plugin-prop -h host -p port plugin-name argument:attribute-name \
       argument:subtreeBaseDN argument:subtreeBaseDN...
    • 要在现有参数列表中添加参数,请使用以下命令:


      $ dsconf set-plugin-prop -h host -p port plugin-name argument+:argument-value
      
    • 要根据子树基条目的对象类定义子树,则第一个参数必须包含 attribute=attribute-name(用于指定应具有唯一值的属性的名称)。第二个参数必须是 baseObjectClass(用于确定要实现唯一性的子树的基条目)。也可以选择在第三个参数中指定 entryObjectClass,以便插件只在特定操作(以具有此对象类的条目为目标)中实现唯一性。


      $ dsconf set-plugin-prop -h host -p port plugin-name argument:attribute=attribute-name \
       argument:markerObjectClass=baseObjectClass argument:requiredObjectClass=entryObjectClass
      

    在所有插件参数中,= 符号的前后不能出现空格。

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

将唯一性插件用于复制

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

单主复制方案

由于客户端应用程序所做的全部修改都在主副本上执行, 因此应该在主服务器上启用 UID 唯一性插件。应该将此插件配置为在复制的后缀中实现唯一性。由于主服务器可确保必需属性的值是唯一的,因此您不必在使用方服务器上启用此插件。

在单个主服务器的使用方上启用 UID 唯一性插件不会影响复制或普通的服务器操作。但是,它可能会导致性能略微下降。

多主复制方案

UID 唯一性插件不适用于多主复制方案。由于多主复制使用宽松的一致性复制模型,因此即使在两个服务器上都启用了此插件,也不会检测到同时在这两个服务器上添加相同属性值的操作。

但是,如果要执行唯一性检查的属性是命名属性,并且在所有主服务器上的相同子树中为同一属性启用了 UID 唯一性插件,则可以使用此唯一性插件。

满足上述条件时,在复制时会将一致性冲突报告为命名冲突。命名冲突必须手动解决。有关详细信息,请参见解决常见复制冲突