摘要:LDAP提供了標(biāo)準(zhǔn)的接口用于目錄數(shù)據(jù)的訪問,但是這類接口針對(duì)目錄信息樹中的條目進(jìn)行操作,屬于較低層次的接口;同時(shí),由于業(yè)務(wù)實(shí)體和目錄條目之間不完全是一對(duì)一的關(guān)系,基于該標(biāo)準(zhǔn)接口開發(fā)的軟件很難滿足非功能性需求。為此,文章闡述了面向?qū)ο竽夸浽L問操作封裝的必要性,并提出了針對(duì)目錄服務(wù)的LDAP目錄訪問模型及其實(shí)現(xiàn)技術(shù)。
關(guān)鍵詞:LDAP;目錄訪問;目錄信息樹;對(duì)象/條目映射;類型轉(zhuǎn)換
0 引言
構(gòu)建一個(gè)典型的企業(yè)應(yīng)用需要數(shù)據(jù)庫和目錄服務(wù)的合作以共同承擔(dān)信息資源的存儲(chǔ)。LDAP目錄服務(wù)適合存儲(chǔ)相對(duì)靜態(tài)的,存在大量讀操作的信息資源。隨著網(wǎng)絡(luò)應(yīng)用的普及,它的作用日益重要,如它既是數(shù)字化校園中統(tǒng)一認(rèn)證的重要支撐體,也是數(shù)字化校園中基礎(chǔ)信息的主要存儲(chǔ)體。
很多利用LDAP目錄服務(wù)的網(wǎng)絡(luò)應(yīng)用直接在LDAP接口上開發(fā)。這樣開發(fā)出來的應(yīng)用其兼容性差;其次,開發(fā)效率低,開發(fā)人員必須同時(shí)兼顧業(yè)務(wù)邏輯和LDAP的知識(shí);最后,應(yīng)用代碼和目錄服務(wù)的耦合度高,不利于底層目錄服務(wù)產(chǎn)品的更換。因此,有必要尋找一種新的基于LDAP的應(yīng)用模式。
1 基于LDAP的面向?qū)ο竽夸浽L問模型
在典型的三層網(wǎng)絡(luò)應(yīng)用軟件系統(tǒng)中,業(yè)務(wù)服務(wù)層是應(yīng)用軟件系統(tǒng)的核心部分,它可以細(xì)分為四個(gè)子層,分別是業(yè)務(wù)接口子層、業(yè)務(wù)處理子層、數(shù)據(jù)實(shí)體子層和數(shù)據(jù)訪問子層。前面兩層因?yàn)楦鷺I(yè)務(wù)緊密結(jié)合,不具有可抽象性。而數(shù)據(jù)實(shí)體子層和數(shù)據(jù)訪問子層的封裝是模型需要解決的主要問題。
本文給出的模型由接口層和目錄訪問層組成。接口層是應(yīng)用系統(tǒng)與模型的交互界面,抽象目錄訪問操作是應(yīng)用系統(tǒng)業(yè)務(wù)實(shí)體的父類,業(yè)務(wù)實(shí)體的具體訪問操作全部委托給下面的目錄訪問層。目錄訪問層即數(shù)據(jù)訪問子層實(shí)現(xiàn)了許多具體目錄訪問操作,如對(duì)象/條目映射(O/E映射)、數(shù)據(jù)類型轉(zhuǎn)換等等,同時(shí)封裝了底層的LDAP目錄服務(wù)存儲(chǔ)機(jī)制,如維護(hù)與LDAP目錄服務(wù)的連接、對(duì)LDAP目錄服務(wù)的訪問等等。
1.1 接口層
接口層提供了一套面向?qū)ο竽P偷某橄竽夸浽L問操作集合,包括簡單地創(chuàng)建對(duì)象、讀取對(duì)象、更新對(duì)象、刪除對(duì)象,以及條件或關(guān)聯(lián)的多對(duì)象實(shí)例操作。
目錄訪問對(duì)象只提供目錄訪問操作接口,其真正操作被委托給下層即目錄訪問層的目錄訪問管理器。這種處理模式結(jié)合了對(duì)象層和中間人兩種模式。在對(duì)象層模式中,每個(gè)業(yè)務(wù)實(shí)體對(duì)象繼承了@抽象的PersistentObject類,可執(zhí)行必要的CRUD操作。這種模式下,在每個(gè)業(yè)務(wù)對(duì)象類中都要寫一些數(shù)據(jù)服務(wù)層規(guī)范的訪問代碼,維護(hù)比較困難,但是這種模式易于實(shí)現(xiàn)。在中間人模式中,中間人可以從數(shù)據(jù)服務(wù)層中讀取業(yè)務(wù)實(shí)體對(duì)象或?qū)?duì)象寫入數(shù)據(jù)服務(wù)層,中間人必須知道每個(gè)業(yè)務(wù)實(shí)體對(duì)象的格式,依據(jù)數(shù)據(jù)服務(wù)層提供的訪問規(guī)范生成語句去讀寫。這種模式將數(shù)據(jù)服務(wù)層訪問代碼和業(yè)務(wù)實(shí)體對(duì)象類分離開來,是一種最具伸縮性的解決方案,但是需要很多基礎(chǔ)部件。
系統(tǒng)中需要持久到目錄服務(wù)的業(yè)務(wù)對(duì)象必須繼承于該接口,業(yè)務(wù)對(duì)象的實(shí)際存取操作由目錄訪問層實(shí)現(xiàn)。因此,業(yè)務(wù)對(duì)象和目錄訪問層之間是一種松散的耦合關(guān)系。
1.2 目錄訪問層
目錄訪問層從邏輯上由兩部分組成:構(gòu)建時(shí)(Build-time)部分和運(yùn)行時(shí)(Run-time)部分。構(gòu)建時(shí)部分解決系統(tǒng)開發(fā)時(shí)所需要解決的問題。對(duì)于本模型,所需要解決的問題就是目錄訪問對(duì)象和目錄條目的映射以及它們的屬性之間的映射,因此,在構(gòu)建時(shí)需要提供這兩類映射信息,它們分別是O/E(對(duì)象/條目)映射信息和屬性映射信息。
運(yùn)行時(shí)部分解決系統(tǒng)運(yùn)行時(shí)需要解決的問題,包括對(duì)O/E映射和屬性映射的解析、抽象目錄訪問的解析以及數(shù)據(jù)的存取操作。這部分主要由目錄訪問管理器、O/E映射管理器、屬性映射管理器、數(shù)據(jù)類型管理器、目錄訪問描述器和運(yùn)行時(shí)管理器組成。
目錄訪問管理器是本模型的總管,它負(fù)責(zé)接收目錄訪問對(duì)象所請(qǐng)求的目錄訪問操作,從O/E映射管理器和屬性映射管理器中獲取目錄訪問對(duì)象的映射信息,對(duì)目錄訪問操作進(jìn)行解析,調(diào)用目錄訪問描述器將面向?qū)ο蟮哪夸浽L問操作映射到目錄服務(wù)層中可用的目錄訪問操作,最后將目錄訪問操作委派給運(yùn)行時(shí)管理器完成。
O/E映射管理器負(fù)責(zé)目錄訪問對(duì)象與目錄信息樹中條目的映射管理。在系統(tǒng)啟動(dòng)時(shí),該管理器讀取O/E映射配置信息,在內(nèi)存中保存配置信息的副本。當(dāng)目錄訪問管理器向其發(fā)送請(qǐng)求時(shí),將配置信息提供給目錄訪問管理器。
屬性映射管理器負(fù)責(zé)目錄訪問對(duì)象的屬性與目錄信息樹中條目的屬性之間的映射管理。在系統(tǒng)啟動(dòng)時(shí),該管理器讀取屬性映射配置信息,在內(nèi)存中保存配置信息的副本。當(dāng)目錄訪問管理器向其發(fā)送請(qǐng)求時(shí),將配置信息提供給目錄訪問管理器。
數(shù)據(jù)類型管理器負(fù)責(zé)目錄訪問對(duì)象中的數(shù)據(jù)類型與目錄服務(wù)層中的數(shù)據(jù)類型之間的映射管理。由于目錄訪問對(duì)象所使用的數(shù)據(jù)類型與條目所使用的數(shù)據(jù)類型并不完全相同,因此有必要進(jìn)行映射以滿足目錄訪問對(duì)象和條目的各種需要。該管理器服務(wù)于屬性映射管理器。
目錄訪問描述器它將面向?qū)ο蟮哪夸浽L問操作映射為目錄服務(wù)層中相應(yīng)的目錄訪問操作。面向?qū)ο蟮哪夸浽L問操作與目錄服務(wù)層的目錄訪問操作并不完全相同,如一個(gè)面向?qū)ο蟮哪夸浽L問操作對(duì)應(yīng)著目錄服務(wù)層的一組相關(guān)操作,因此,需要進(jìn)行這樣的映射。該目錄訪問描述器服務(wù)于目錄訪問管理器。
運(yùn)行時(shí)管理器面向?qū)ο蟮哪夸浽L問操作最終要轉(zhuǎn)換為目錄訪問層能接受的操作才能使業(yè)務(wù)對(duì)象得到持久化,運(yùn)行時(shí)管理器就是將上面轉(zhuǎn)換后的操作真正地送給目錄服務(wù)層進(jìn)行運(yùn)算。同時(shí),負(fù)責(zé)對(duì)象標(biāo)識(shí)管理和目錄連接管理等運(yùn)行時(shí)環(huán)境的管理。出于效率的考慮,在運(yùn)行時(shí)管理器中可以進(jìn)行必要的優(yōu)化,如設(shè)置連接池等等。
2 關(guān)鍵技術(shù)
2.1 數(shù)據(jù)類型轉(zhuǎn)換
LDAP的屬性類型和Java的數(shù)據(jù)類型之間存在著一定的對(duì)應(yīng)關(guān)系,LDAP中給定的各種語法類型都對(duì)應(yīng)于Java語言中的String類型。當(dāng)將對(duì)象數(shù)據(jù)模型中的值存到LDAP目錄服務(wù)中時(shí),需要將Java語言中定義的數(shù)據(jù)類型轉(zhuǎn)換為String類型;反之,當(dāng)LDAP目錄服務(wù)中的數(shù)據(jù)存放到對(duì)象中時(shí),需要將String類型轉(zhuǎn)換為對(duì)象中原來定義的類型。因此,需要一個(gè)類型轉(zhuǎn)換器來完成這些工作。
類型轉(zhuǎn)換器需要獲取數(shù)據(jù)的類型配置信息,然后根據(jù)這些配置信息將數(shù)據(jù)轉(zhuǎn)換為String類型,反之亦然。我們選用XML描述數(shù)據(jù)的類型配置信息,將數(shù)據(jù)類型分成三類:簡單數(shù)據(jù)類型、復(fù)雜數(shù)據(jù)類型和數(shù)組。具體的類型描述規(guī)范。
2.2 O/E映射
對(duì)象模型向LDAP信息模型轉(zhuǎn)換的基礎(chǔ)是對(duì)象映射為目錄條目,對(duì)象的屬性映射為條目的屬性。為了實(shí)現(xiàn)模型轉(zhuǎn)換,O/E映射需要兩類信息,即對(duì)象類元信息和對(duì)象域元信息。對(duì)象類元信息存放實(shí)體類上下文信息。對(duì)象域元信息描述了對(duì)象類的屬性配置信息:如果是基本類型則可以對(duì)應(yīng)為相應(yīng)目錄服務(wù)的屬性(但并不一定是一一對(duì)應(yīng));如果是實(shí)體對(duì)象,則需要在對(duì)象域元信息中填寫相應(yīng)信息,如對(duì)象之間的關(guān)系等等。
2.3 表達(dá)能力的設(shè)計(jì)
目錄訪問查詢操作分為簡單查詢、復(fù)雜查詢和助手類操作。簡單查詢實(shí)現(xiàn)對(duì)單個(gè)對(duì)象的CRUD操作,復(fù)雜查詢則處理批量對(duì)象的操作,助手類操作包括用戶認(rèn)證、新增用戶等LDAP常規(guī)操作。
簡單查詢的實(shí)現(xiàn)可以采用兩種方式:第一種是將操作賦予對(duì)象本身,這種處理方式符合面向?qū)ο蟮牧?xí)慣;第二種是提供一個(gè)專門處理目錄訪問操作的工具類,作為目錄訪問操作的代理,執(zhí)行用戶的對(duì)象式查詢語句。具體采用哪種方式可以有中間件設(shè)計(jì)人員確定。
本文采用第一種方式實(shí)現(xiàn),即目錄訪問操作作為對(duì)象的行為來實(shí)現(xiàn)目錄的訪問,具體定義示例如下:
/*
*判斷存儲(chǔ)空間是否存在指定實(shí)體Bean實(shí)例
*@param entity實(shí)體Bean實(shí)例,不能為空,否則拋出異常
*@throws如果實(shí)例的主鍵屬性未設(shè)置則拋出異常
*/
public boolean entityExists(Entity entity)throws XDOException;
3 結(jié)束語
本文從普遍性出發(fā),給出了解決通用目錄訪問所涉及到的技術(shù)內(nèi)容。作為通用目錄訪問產(chǎn)品的開發(fā)者,也可以將文中所給模型作為參考模型,采用熟悉的語言和環(huán)境實(shí)現(xiàn)。本模型及其中間件被用于浙江大學(xué)數(shù)字化校園應(yīng)用中,取得了良好的效果。