JNDI

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