Sun Java(TM) System Directory Server 5 2004Q2 管理指南 |
第 15 章
強制屬性值唯一性UID 唯一性 Plug-in 能確保所指定的屬性值,在目錄或樹狀子目錄內的所有項目中是唯一的。當有任何作業嘗試加入含有指定屬性現有值的項目,或有任何作業加入或修改屬性成為目錄中的現有值時,Plug-in 會停止這些作業。
依預設值停用 UID 唯一性 Plug-in。啟用後,可依預設值確保 uid 屬性的唯一性。您可以建立新的 Plug-in 實例,以在其他屬性上強制執行唯一值。UID 唯一性 Plug-in 的限制是:它只能確保單一伺服器上屬性值的唯一性。
本章包含下列章節:
概論UID 唯一性 Plug-in 是一個前置作業 Plug-in,它會在伺服器更新目錄之前,檢查所有的 LDAP 作業。Plug-in 會判斷該作業是否會導致兩個項目擁有相同的屬性值,當發生這種情況時,伺服器會中止作業並傳回錯誤 19 LDAP_CONSTRAINT_VIOLATION 至用戶端。
您可以配置 Plug-in 在目錄內一個或多個樹狀子目錄中,或是在特定物件類別的項目之間,強制執行唯一性。這個組態決定將強制執行唯一屬性值的項目組。只有當作業的目標是這個項目組中的項目時,且該屬性值在這組所有項目之間不是唯一值時,作業才會被中止。
如果您希望強制執行其他屬性的唯一性,您可以定義多個 UID 唯一性 Plug-in 的實例。定義您要其值為唯一的每個屬性和項目組的一個 Plug-in 實例。您也可以讓同一個屬性擁有多個 Plug-in 實例,以在多個項目組中強制執行「不同」的唯一性。每一組中只允許一次指定屬性。
當您在現有目錄上啟用屬性唯一值時,伺服器並不會在現有項目間檢查唯一值。而只有在加入項目,或者是加入或修改屬性時,才會強制執行唯一性。
依預設值,UID 唯一性 Plug-in 是停用的,因為它會影響多重主機複製的作業。您可以在使用複製時啟用 UID 唯一性 Plug-in,但您應該要注意「使用有複製的唯一性 Plug-in」中所描述的行為。
強制執行 uid 屬性的唯一性本節說明如何啟用和配置 uid 屬性的預設唯一性 Plug-in。若要強制執行其他屬性的唯一性,請參閱「強制執行其他屬性的唯一性」。
使用主控台配置 Plug-in
使用主控台時,您必須修改預設的 uid 唯一性 Plug-in,以強制執行其他屬性唯一性。如果不希望擁有 uid 唯一性 Plug-in,請將它維持在停用狀態,並為其他屬性建立新的 Plug-in 實例,如「強制執行其他屬性的唯一性」所述。
- 在 Directory Server Console 最上層 [組態] 標籤上,展開 Plug-in 節點,並選取 uid uniqueness Plug-in。
- 在右窗格中,選取核取方塊以啟用 Plug-in。
請勿修改初始化功能或 Plug-in 模組路徑的欄位。
- 根據您指定已強制執行唯一性之樹狀子目錄的方式,修改 Plug-in 引數。
- 若要指定單一樹狀子目錄的 Base DN,請編輯引數 2 的值。若要指定一個以上的樹狀子目錄,請按一下 [加入] 以加入更多引數,並在每個新文字欄位中輸入樹狀子目錄的 Base DN。
- 若要依基礎項目的物件類別來指定樹狀子目錄,請將引數設定成下列的值:
引數 1:attribute=uid
引數 2:markerObjectClass=baseObjectClassPlug-in 將在目錄內每個項目下的樹狀子目錄中強制執行 uid 唯一性,該目錄具有指定的 baseObjectClass。例如,如果您在許多分支中都有使用者項目,如 ou=Employees 和 ou=Contractors,則請指定 markerObjectClass=organizationalUnit。
因為標示物件類別下的分支範圍可能相當大,您可能需要進一步限制屬性唯一性的執行,以根據項目的物件類別來確認項目。按一下 [加入] 加入第三個 Plug-in 引數,並將它設定為下列的值:
引數 3:requiredObjectClass=entryObjectClass
在具有 baseObjectClass 之項目的樹狀子目錄中,只有當作業以具有 entryObjectClass 的項目為目標時,Plug-in 才會強制執行唯一性。例如,如果您有傳統的使用者項目,請指定 requiredObjectClass=inetorgperson。
- 當您編輯完 uid 唯一性 Plug-in 後,請按一下 [儲存]。系統會提醒您必須重新啟動伺服器才能使變更生效。
- 重新啟動伺服器以開始強制執行 uid 屬性的唯一值。
從指令行配置 Plug-in
下列程式描述如何使用 ldapmodify 指令啟用和配置 uid 唯一性 Plug-in。Plug-in 組態項目的 DN 為 cn=uid uniqueness,cn=plugins,cn=config。
- 將 nsslapd-pluginEnabled 屬性設定為 on 或 off,可分別啟用或停用 Plug-in。
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- 根據您指定已強制執行唯一性之樹狀子目錄的方式,修改 Plug-in 引數。
- 若要指定單一樹狀子目錄的 Base DN,請修改 nsslapd-pluginarg1 的值:
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若要指定一個以上的樹狀子目錄,請加入更多引數,並以樹狀子目錄的完整 Base 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- 若要根據樹狀子目錄的基礎項目中之類別物件來指定該樹狀子目錄,請將引數設定成下列的值:Plug-in 會在具有 baseObjectClass 的每個項目下的樹狀子目錄中,強制執行 uid 屬性的唯一性。或者,您可以在第三個引數中指定 entryObjectClass,如此只有在作業以具有此物件類別的項目為目標時,Plug-in 才會強制執行唯一性。
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- 重新啟動伺服器以使變更生效。
強制執行其他屬性的唯一性UID 唯一性 Plug-in 可以用來強制執行任何屬性的唯一性。您必須在目錄中的 cn=plugins,cn=config 下建立新的項目,才能建立 Plug-in 的新實例。
- 使用 ldapmodify 指令來加入新 Plug-in 實例的組態項目。指令的第一部分如下所示。指令的其他部分則顯示在下列步驟中。
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。當伺服器重新啟動後,將新實例的啟用狀態指定為 on 或 off。
- 指令的其他部分會指定 Plug-in 引數,這些引數視您決定要強制執行唯一性的樹狀子目錄之方式而定:
- 若要根據其 Base DN 來定義一或多個樹狀子目錄,則第一個引數必須是屬性的名稱,且應該具有唯一值,而後續的引數則是樹狀子目錄基礎項目的完整 DN:
nsslapd-pluginarg0: attribute_name
nsslapd-pluginarg1:subtreeBaseDN
nsslapd-pluginarg2:subtreeBaseDN
...
^D- 若要根據樹狀子目錄的基礎項目內物件類別來定義該樹狀子目錄,則第一個引數必須包含 attribute=attribute_name,以指定應該具有唯一值的屬性名稱。第二個引數必須是 baseObjectClass,此引數決定要強制執行唯一性之樹狀子目錄的基礎項目。或者,您可以在第三個引數中指定 entryObjectClass,如此只有當作業以具有此物件類別的項目為目標時,Plug-in 才會強制執行唯一性。
nsslapd-pluginarg0:attribute=attribute_name
nsslapd-pluginarg1:markerObjectClass=baseObjectClass
nsslapd-pluginarg2:requiredObjectClass=entryObjectClass
^D在所有的 Plug-in 引數中,等號 ( = ) 前後都不可以有空格。
- 重新啟動伺服器,將這個唯一性 Plug-in 的新實例載入伺服器中。
使用有複製的唯一性 Plug-in當更新作業是複製作業的一部分時,UID 唯一性 Plug-in 並不會對屬性值進行任何檢查。這不會影響單一主機的複製,但 Plug-in 無法自動對多重主機複製強制執行屬性唯一性。
單一主機複製案例
因為用戶端應用程式所做的所有修改都是在主機複本上執行,所以主機伺服器上應該啟用 UID 唯一性 Plug-in。此外,應該配置 Plug-in 以強制執行複製尾碼中的唯一性。因為主機會確定所需屬性的值是唯一的,所以不需要在用戶伺服器上啟用 Plug-in。
在單一主機的用戶上啟用 UID 唯一性 Plug-in,並不會干擾複製或正常的伺服器作業,但卻可能讓效能稍微降低。
多重主機複製案例
UID 唯一性 Plug-in 的設計,並不適用於多重主機複製案例。因為多重主機複製對複製模型的一致性要求不嚴謹,所以同時在兩台伺服器上加入相同的屬性值並不會被刪除,即使這兩台伺服器都已經啟用 Plug-in。
但是,您可以在下列情況中使用 UID 唯一性 Plug-in:
遇到這些情況時,系統會在複製期間將唯一性衝突報告為命名衝突。命名衝突需要以手動方式解決。如需關於解決複製衝突的資訊,請參閱「解決一般複製衝突」。