5.2. 关于属性唯一性
Attribute Uniqueness 插件是一个预先合作插件。这意味着,插件会在服务器执行 LDAP 操作 前检查 所有更新操作。该插件决定操作是否应用到某一属性以及它配置为监控的后缀。
如果更新操作应用到插件监控的属性和后缀,并导致两个条目具有相同的属性值,则服务器终止该操作并将 LDAP_CONSTRAINT_VIOLATION 错误返回给客户端。
属性插件的每个实例都在一个或多个子树的单个属性上执行检查。要检查多个属性的唯一性,必须为每个要检查的每个属性创建一个插件实例。
Attribute Uniqueness 插件可以采用特定的用户定义的方法操作:
- 它可以检查指定子树中的每个条目。例如,如果某个公司是 example.com,则托管 example_a.com 和 example_b.com 的目录,当一个条目(如 uid=jdoe,ou=people,o=example_a,dc=example,dc=com )中被添加,唯一性需要只在 o=example_a,dc=example,dc=com 子树中强制执行。这可以通过在属性唯一标识符配置中明确列出子树的 DN。
- 指定与更新条目 DN 中的条目相关的对象类,并对它下的所有条目执行唯一性检查。这个选项在托管环境中很有用。例如,当添加诸如 uid=jdoe,ou=people, o=example_a,dc=example,dc=com 等条目时,在 o=example_a,dc=example,dc=example,dc=com 子树中显式列出此子树时,通过指示 标记对象类。如果标记对象类设置为 机构,则唯一性检查算法会在 DN 中查找具有此对象类(o=example_a)的条目,并对它下的所有条目执行检查。另外,只有在更新的条目包含指定对象类时,才能检查唯一性。例如,只有在更新的条目包含 objectclass=inetorgperson 时,才能执行检查。
当目录服务器首次设置时,目录服务器为
uid
属性提供属性唯一插件的默认实例。此插件实例确保提供给 uid
属性的值在 root 后缀中是唯一的(与 userRoot 数据库对应的后缀)。
此插件默认是禁用的,因为它会影响多层次复制的操作。
当更新作为复制操作的一部分执行时,属性插件不会对属性值执行任何检查。
由于客户端应用程序的所有修改都在供应商服务器上执行,因此应在供应商上启用属性插件。在消费者服务器上启用它是不需要的。
在消费者上启用属性唯一插件不会阻止目录服务器正确运行,但可能导致性能下降。
在多层次复制方案中,供应商同时充当同一副本的供应商和消费者。由于多组复制使用松散一致的复制模型,因此在一台服务器上启用属性唯一性插件不足,从而确保在任意给定时间在两个供应商服务器中都是唯一的属性值。因此,在一个服务器上启用属性插件可能会导致每个副本中保存的数据不一致。
但是,可以使用属性唯一插件,从而满足以下条件:
- 执行唯一性检查的属性是 naming 属性。
- 在这两个供应商服务器上都启用了属性唯一插件。
满足这些要求时,复制时会报告属性唯一性冲突。命名冲突需要手动解析。