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 外掛程式。
  2. 在右窗格中,選取核取方塊以啟用外掛程式。
  3. 請勿修改初始化功能或外掛程式模組路徑的欄位。

  4. 根據您指定已強制執行唯一性之樹狀子目錄的方式,修改外掛程式引數。
  5. 要指定單一樹狀子目錄的 Base DN,請編輯引數 2 的值。若要指定一個以上的樹狀子目錄,請按一下 [加入] 以加入更多引數,並在每個新文字欄位中輸入樹狀子目錄的 Base DN。
  6. 若要依基礎項目的物件類別來指定樹狀子目錄,請將引數設定成下列的值:

引數 1:attribute=uid
引數 2:markerObjectClass=baseObjectClass

外掛程式將在目錄內每個項目下的樹狀子目錄中強制執行 uid 唯一性,該目錄具有指定的 baseObjectClass。例如,如果您在許多分支中都有使用者項目,如 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 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. 要指定單一樹狀子目錄的 Base 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

      若要指定一個以上的樹狀子目錄,請加入更多引數,並以樹狀子目錄的完整 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

    6. 要根據樹狀子目錄的基礎項目中之類別物件來指定該樹狀子目錄,請將引數設定成下列的值:外掛程式會在具有 baseObjectClass 的每個項目下的樹狀子目錄中,強制執行 uid 屬性的唯一性。或者,您可以在第三個引數中指定 entryObjectClass,如此只有在作業以具有此物件類別的項目為目標時,外掛程式才會強制執行唯一性。
    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.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 uniquenessServerRoot 和程式庫 extension 則視您的平台而定。最後,當伺服器重新啟動後,將新實例的 state 指定為 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. 要根據其 Base 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. 保留所有權利。