Apache Directory Server(ApacheDS)是一個開源、基於 Java 的目錄服務實作,支援多種網路協定,其中最核心的是輕量級目錄存取協定(LDAP)。本系列文章分為兩部分,第一部分將帶領讀者深入了解 ApacheDS 的模組化架構、LDAP 基礎概念,以及如何利用 JXplorer 瀏覽與操作目錄資料,為第二部分實際將 Java 物件序列化並儲存至 ApacheDS 鋪路。
ApacheDS 的核心是目錄服務,負責資料儲存與搜尋操作。協定實作層建立在目錄服務之上,提供 LDAP、Kerberos 等網路服務。ApacheDS 採用可插拔的協定架構,透過 MINA(Multipurpose Infrastructure for Network Applications)框架,允許開發者輕鬆加入新的協定實作。MINA 定義了 ProtocolProvider、ProtocolCodecFactory、ProtocolEncoder/Decoder 等介面,協定提供者實作這些介面,ApacheDS 框架即可透過統一的 JNDI 介面處理不同協定的請求,實現「一次儲存,多協定存取」的彈性。
LDAP 使用樹狀結構組織資料,每個條目擁有唯一的辨別名稱(Distinguished Name, DN),由相對辨別名稱(RDN)與父節點 DN 組合而成。條目包含屬性,每個屬性對應一個屬性類型(attributeType),定義了資料的語法、比對規則等。物件類別(objectClass)則是屬性類型的集合,分為抽象、結構性、輔助三種類型,所有條目必須包含一個結構性物件類別,並繼承自 top 類別。
JXplorer 是開源的 LDAP 瀏覽器,提供圖形化介面檢視 ApacheDS 的樹狀結構、模式定義與資料內容。安裝並啟動 ApacheDS(預設監聽 localhost:389)後,使用 JXplorer 以管理員帳號(uid=admin,ou=system / secret)連線,即可在 Explore 分頁查看預設資料,在 Schema 分頁檢視屬性類型、物件類別與 LDAP 語法定義。
實作範例中,我們在 ou=users,ou=system 下建立使用者 uid=Alice,指定結構性物件類別 organizationalPerson,填寫必屬性 cn、sn,完成第一個 LDAP 條目的建立。
要將 Java 物件儲存至 LDAP,必須先將物件轉為位元組流。Java 序列化機制(實作 java.io.Serializable)由 JRE 內建的序列化執行期處理;若需自訂邏輯,可實作 writeObject/readObject。遠端方法呼叫(RMI)則在序列化基礎上加入編組過程,插入特殊標記以支援跨網路的物件傳遞。
RFC 2713 定義了四個核心物件類別:
cn 屬性,用於命名包含 Java 物件的容器條目。javaClassName、javaClassNames、javaCodebase、javaDoc、description 等輔助屬性,利於搜尋與管理。javaObject,新增 javaSerializedData 屬性(Octet String 語法),儲存序列化後的位元組資料。javaObject,新增 javaReferenceAddress、javaFactory,支援儲存物件參考而非實體,利於共享。實際儲存時,條目需同時使用結構性類別(如 javaContainer)與對應的輔助類別(如 javaSerializedObject),並自動繼承 top。
第二部分將示範完整的 Java 程式碼,實作物件的序列化、編組、儲存、搜尋與還原,並提供可重用的工具類別。