在一個企業(yè)中,命名服務(wù)為讀者的應(yīng)用程序在網(wǎng)絡(luò)上定位對象提供了一種方法。一個命名服務(wù)將對象和名稱聯(lián)系在了一起,并且可以通過它們指定的名稱找到相應(yīng)的對象。
JNDI 是Java命名和目錄接口,是一個為Java應(yīng)用程序提供命名服務(wù)的應(yīng)用程序編程接口(API)。它為開發(fā)人員提供了查找和訪問各種命名和目錄服務(wù)的通用、統(tǒng)一的接口,類似于JDBC都是構(gòu)建在抽象層上。要使用JNDI,必須要安裝jdk 1.3以上版本。
JNDI 包含了大量的命名和目錄服務(wù),它使用通用接口來訪問不同種類的服務(wù),可以同時連接到多個命名或目錄服務(wù)上并建立起邏輯關(guān)聯(lián)。
命 名服務(wù)是一種服務(wù),它提供了為給定的數(shù)據(jù)集創(chuàng)建一個標(biāo)準(zhǔn)名字的能力。它允許把名稱同Java對象或資源關(guān)聯(lián)起來,而不必指出對象或資源的物理ID。這類似 于字典結(jié)構(gòu)(或者是Java的map結(jié)構(gòu)),該結(jié)構(gòu)中鍵映射到值。例如在Internet上的域名服務(wù)(domain naming service,DNS)就是提供將域名映射到IP地址的命名服務(wù),在打開網(wǎng)站時一般都是在瀏覽器中輸入名字,通過DNS找到相應(yīng)的IP地址,然后打開。
所有的因特網(wǎng)通信都使用TCP、UDP或IP協(xié)議。IP地址由4個字節(jié)32位二進(jìn)制數(shù)字組成,數(shù)字和名字相比,對于人來說名字比數(shù)字要容易記憶,但對于計算機(jī)來講,它更善于處理數(shù)字。
其實所有的命名服務(wù)都提供DNS這種基本功能,即一個系統(tǒng)向命名服務(wù)注冊,命名服務(wù)提供一個值到另一個值的映射。然后,另外一個系統(tǒng)訪問命名服務(wù)就可以取得映射信息。這種交互關(guān)系對分布式企業(yè)級應(yīng)用來講顯得非常重要。
在 Java中,基本的名字操作包含在Context接口中。
目 錄服務(wù)是一種特殊類型的數(shù)據(jù)庫,與SQL Server、Access、Oracle等關(guān)系數(shù)據(jù)庫管理系統(tǒng)相反,構(gòu)造目錄服務(wù)的目的是為了處理基于行為的事務(wù),并且使用一種關(guān)系信息模型。目錄服務(wù) 將命名服務(wù)的概念進(jìn)一步引申為提供具有層次結(jié)構(gòu)的信息庫,這一信息庫除了包含一對一的關(guān)系外,還有信息的層次結(jié)構(gòu)。對目錄服務(wù)而言,這種層次結(jié)構(gòu)通常用于 優(yōu)化搜索操作,并且也可以按實際情況進(jìn)行分布或者跨網(wǎng)絡(luò)復(fù)制。
一個目錄服務(wù)通常擁有一個名字服務(wù)(但是一個名字服務(wù)不必具有一個目錄服務(wù))。如電話簿就是一個典型的目錄服務(wù),一般先在電話簿里找到相關(guān)的人名,再找到這個人的電話號碼。
每一種目錄服務(wù)都可以存儲有關(guān)用戶名、用戶密碼、用戶組(如有關(guān)訪問控制的 信息)、以太網(wǎng)地址、IP地址等信息。它所支持的信息和操作會因為所使用的目錄服務(wù)的不同而不同。遺憾的是,訪問不同目錄服務(wù)的協(xié)議也會不同,所以讀者需要了解多 種API。
這就是JNDI的起源,就像JDBC一樣,JNDI充當(dāng)不同名稱和目錄服務(wù)的通用API或者說是前端,然后使用不同的后端適配器來連接實際服務(wù)。如圖6-1 顯示了JNDI和LDAP如何共同合作,為客戶提供一種完美的解決方案。
在這里,使用JNDI完成與LDAP服務(wù)器之間的通信,對開發(fā)者來說他們只擔(dān)心一個特殊協(xié)議(LDAP)和一個API(JNDI),而由開發(fā)商給他們自己的各個協(xié)議提供LDAP接口。事實上對這些流行的目錄服務(wù)中來說,都有產(chǎn)品可讓開發(fā)者通過LDAP與這些目錄服務(wù)通信。
JNDI 是J2EE技術(shù)中的一個完整的組件。它支持通過一個單一的方法訪問不同的、新的和已經(jīng)存在的服務(wù)的方法。這種支持允許任何服務(wù)提供商執(zhí)行通過標(biāo)準(zhǔn)服務(wù)提供 商接口(SPI)協(xié)定插入JNDI框架。另外,JNDI允許Weblogic服務(wù)器上的Java應(yīng)用程序通過插入適當(dāng)?shù)姆?wù)提供者來訪問像LDAP這樣的 標(biāo)準(zhǔn)化方式的外部目錄服務(wù)。
基本的目錄服務(wù)操作包含在DirContext接口中。
輕量目錄訪問協(xié)議(lightweight directory access protocol,LDAP)是在20世紀(jì)90年代早期作為標(biāo)準(zhǔn)目錄協(xié)議進(jìn)行開發(fā)的。它是目前最流行的目錄協(xié)議,與廠商跟平臺無關(guān)。
LDAP 可以追溯到X.500協(xié)議,而X.500協(xié)議最初是基于OSI網(wǎng)絡(luò)協(xié)議發(fā)展起來的。LDAP的第3版協(xié)議是在RFC2251中定義的,并且已經(jīng)非常成熟,它的最新補(bǔ)充部分包含LDAP的XML規(guī)范,稱為目錄服務(wù)標(biāo)記語言。
Java 語言通過使用LDAP API,如Netscape Directory 服務(wù)器可以直接使用LDAP,或者通過JNDI來使用LDAP。JNDI是J2SE中的標(biāo)準(zhǔn)API,是通用的API,不必綁定到LDAP。
LDAP 定義客戶應(yīng)當(dāng)如何訪問服務(wù)器中的數(shù)據(jù),它并不指定數(shù)據(jù)應(yīng)當(dāng)如何存儲在服務(wù)器上。大多數(shù)情況下,開發(fā)者只需要和一個專為LDAP設(shè)計的目錄服務(wù),或現(xiàn)有目錄 服務(wù)的LDAP前端打交道。LDAP能夠成為任何數(shù)據(jù)存儲類型的前端。目前最流行的目錄服務(wù)有NIS、NDS、Active Directory等都有某種類型的LDAP前端。
LDAP 和關(guān)系數(shù)據(jù)庫是兩種不同層次的概念,后者是存儲方式(同一層次如網(wǎng)格數(shù)據(jù)庫,對象數(shù)據(jù)庫),前者是存儲模式和訪問協(xié)議。LDAP是一個比關(guān)系數(shù)據(jù)庫抽象層 次更高的存儲概念,與關(guān)系數(shù)據(jù)庫的查詢語言SQL屬于同一級別。LDAP最基本的形式是一個連接數(shù)據(jù)庫的標(biāo)準(zhǔn)方式,該數(shù)據(jù)庫為讀查詢作了優(yōu)化。因此它可以 很快地得到查詢結(jié)果,不過在其他方面,例如更新操作等就慢得多。
從 另一個意義上來講,LDAP是實現(xiàn)了指定的數(shù)據(jù)結(jié)構(gòu)的存儲,它是一種特殊的數(shù)據(jù)庫。但是LDAP和一般的數(shù)據(jù)庫不同,明白這一點是很重要的。LDAP對查 詢進(jìn)行了優(yōu)化,與寫性能相比,LDAP的讀性能要優(yōu)秀很多。LDAP服務(wù)器也是用來處理查詢和更新LDAP目錄的。換句話說,LDAP目錄也是一種類型的 數(shù)據(jù)庫,但不是關(guān)系型數(shù)據(jù)庫。要特別注意的是,LDAP通常作為一個hierarchal數(shù)據(jù)庫使用,而不是一個關(guān)系數(shù)據(jù)庫。
1.LDAP數(shù)據(jù)
在 LDAP中,數(shù)據(jù)被組織成一棵樹的形式,叫做目錄信息樹(directory information tree,DIT)。DIT中的第一個“葉子”叫做一個條目(entry),第一個條目叫根條目(root entry)。
一 個條目是由一個區(qū)分名稱DN(distinguished name)和任意一個屬性/值對組成。DN是一個條目的名字,它必須是唯一的,它類似于一個關(guān)系型數(shù)據(jù)庫的唯一關(guān)鍵字。DN也表明了該條目與DIT樹的其 他部分之間的關(guān)系,它類似于這種方式:一個文件的全路徑名表明硬盤上的一個特定文件與系統(tǒng)中的其他文件之間的關(guān)系。當(dāng)從根目錄讀取文件時,讀取系統(tǒng)上的文 件路徑是從左到右讀取的,但是當(dāng)從根目錄讀取DN時,是從右到左讀DN的。如:
uid = jordan,ou = nba,o = american
表示定義了在組織american中的小組為 nba的用戶jordan的用戶。其中一個DN名的最左邊部分叫相對區(qū)分名稱RDN(relative distinguished name),它由一個條目內(nèi)的屬性/值組成,如前面的uid = jordan是RDN,后面的可有可無。
LDAP 通常使用簡寫形式的助記符表示其名稱,常用的LDAP屬性及其定義如表6-1所示。
LDAP屬性 | 定義 |
o | Organization:組織 |
ou | Organization unit:組織單元 |
續(xù)表
LDAP屬性 | 定義 |
uid | Userid:用戶id |
cn | Common name:常見名稱 |
sn | 姓 |
givenname | 首名 |
dn | Distinguished Name:區(qū)分名稱 |
| E-mail Address:電子郵件地址 |
其中一個屬性可以有一個或多個值,如一個用戶可以有多個mail。
2.LDAP的功能
到目前為止,我們已經(jīng)介紹了LDAP行程注冊部分,其實LDAP中還包括很多其他的用途,總的來說LDAP的功能包括遠(yuǎn)程服務(wù)的注冊、訪問控制、黃頁服務(wù)器和配置 數(shù)據(jù)。
(1)遠(yuǎn)程服務(wù)器注冊
這 是本章中使用LDAP時所涉及的內(nèi)容,前面已經(jīng)談到過該項功能。LDAP允許遠(yuǎn)程服務(wù)器注冊其可用性,然后允許客戶機(jī)獲得該注冊信息,并且可使用該服務(wù) 器。在某些情況下(如RMI),這可能意味著將可序列化的對象保存在LDAP中,并且在此后可以檢索這些已保存的對象。這類似于rmiregistry的 使用方法,但它能搜索LDAP,而rmiregistry卻不能,并且當(dāng)停止并重新啟動rmiregistry后,原來注冊的對象無效,必須重新注冊所有 對象。
(2)訪問控制
許多企業(yè)應(yīng)用程序都會對訪問它們服務(wù)的用戶進(jìn)行控制。這可能像Web應(yīng)用登錄頁面那樣簡單,也可能像使用數(shù)字簽名那樣復(fù)雜。不論是使用哪種方法,那些待檢查的信息總需要保存到某個地方,有一種選擇是將這些信息保存到LDAP內(nèi)。例如,可以將用戶保存在LDAP中。
(3)黃頁服務(wù)器
黃頁服務(wù)器的作用類似于電話目錄,因此稱為黃頁。它提供信息搜索功能,可以使LDAP根據(jù)條目的屬性內(nèi)容進(jìn)行信息搜索。如對于用戶姓名、計算機(jī)和打印機(jī)等,均可以使用LDAP存儲公司內(nèi)所有員工的這些信息,然后根據(jù)名字為某個特定名字的用戶以及檢索他們的用戶ID搜索。
(4)配置數(shù)據(jù)
LDAP 可以充當(dāng)配置信息的資源中心,這些配置信息在應(yīng)用程序運行時使用。這類似于在Java應(yīng)用程序中使用屬性文件,但是這并不僅僅是每一個應(yīng)用程序的屬性文 件,而是作為一個可用來訪問并且還必須進(jìn)行維護(hù)的單一的信息庫中心。如一些特定應(yīng)用程序使用的共享數(shù)據(jù)庫名稱可以保存到LDAP中。因此,如果數(shù)據(jù)庫名稱 發(fā)生變更時,對于所有需要遷移到新數(shù)據(jù)庫的應(yīng)用程序來講僅僅需要維護(hù)一個地方。
3.使用LDAP
為了使用LDAP,需要完成以下4個步驟。
(1)連接到LDAP服務(wù)器
要使用LDAP,必須首先獲取一個到LDAP的連接。為了完成LDAP的連接,需要知道運行LDAP的主機(jī)和要連接的端口,這有點類似于將電話線插到墻壁的電話孔后才能夠與別人打電話。
(2)綁定到LDAP服務(wù)器
對 于LDAP,通常至少有兩種方法來綁定(登錄)到LDAP服務(wù)器,匿名(LDAP3以上版本)或者作為特定用戶。綁定有些類似于使用電話公司設(shè)置的電話線 撥打朋友的電話。匿名登錄僅僅能夠訪問到一些公共數(shù)據(jù)。如果應(yīng)用程序作為特定用戶登錄時,就可以訪問公共數(shù)據(jù)和特定為該用戶設(shè)置的可訪問的所有數(shù)據(jù)。而為 某個用戶設(shè)置可訪問的數(shù)據(jù)是由LDAP服務(wù)器的訪問控制列表(access control list,ACL)決定。ACL控制哪個用戶能夠讀、寫或者修改該ACL所關(guān)聯(lián)的任何數(shù)據(jù)。一個條目內(nèi)的不同屬性可以與多個不同的ACL相關(guān)聯(lián)。因此,不 同的用戶就能夠看到不同的數(shù)據(jù)項,除此之外,某些特定的屬性可以與多個ACL相關(guān)聯(lián),如一個ACL可以向一個用戶組提供讀的權(quán)限,但是另一個ACL可以向 另一個用戶組提供寫的權(quán)限。
(3)在LDAP服務(wù)器上執(zhí)行所需的任何操作
這些操作主要包括搜索服務(wù)器、增加新條目、修改條目、刪除條目等。
(4)釋放LDAP服務(wù)器的連接
當(dāng)應(yīng)用程序連接到LDAP并完成其相關(guān)工作后,該應(yīng)用程序應(yīng)該關(guān)閉連接以釋放系統(tǒng)資源