JNDI與LDAP

 

尚玉瑋
中原大學電子工程學系

前言



        JNDI提供一種層次化的目錄服務介面:它有可以把簡單的命名服務和簡單的目錄服務模型化的類別,甚至有專門處理LDAP目錄服務的 package。JNDI對應用程式人員來說,是一套強力的工具,並且它可以處理LDAP,ADS等等為目標,就如同JDBC可以處理Oracle, DB2等資料庫。使用JNDI隱藏了許多與各種目錄介面之間的複雜度,然而今天我們將透過一隻範例程式來了解JNDI是如何與Directory Service進行連結與運作。

JNDI Package

        在開始我們的範例程式前,讓我們先來了解JNDI(Java Naming and Directory Interface)它所包含的package有哪些。
  • javax.naming : javax.naming含有Java應用程式存取命名服務所需要的核心類別與介面。
  • javax.naming.directory : javax.naming.directory建立於javax.naming基礎上,這個package提供 使用除了一小部分服務外的所有LDAP所提供的服務時,所需的功能。
  • javax.naming.ldap : 這個package含有使Java應用程式存取LDAP目錄服務相關之特定功能所需的類別,並提供LDAP version 3管理功能的支援。這些功能代表進階的LDAP功能,在大多數的應用程式裡並不常用到這個package。
  • javax.naming.event : 此package含有支援在命名與目錄服務裡的事件通知所需的類別與介面。
  • javax.naming.spi : 提供建立基本的JNDI類別延伸的架構,允許建構其他JNDI服務供應者。這個package可以使得開發人員與協力廠商有能力去建構存取Sun沒有提供支援的其他命名與目錄服務的類別。

工具與環境


  • IBM Http Server 1.3.19
  • IBM SecureWay Directory  3.2.2 版
  • JDK 1.3

環境準備

        為了能夠讓後面的程式範例順利執行,首先我們將在IBM SecureWay Directory(即Directory Service Server)建立一筆資料,以供我們接下來的程式範例使用。

        步驟一:

        開啟Web broswer,並且在網址輸入"http://localhost/ldap/"進入SecureWay的Server Web管理介面,如下圖,並且輸入管理者的帳號、密碼(管理者的帳號內定為(cn=root,而密碼乃是在安裝過程中所設定)

        步驟二:

        進入管理介面後,點選 Setting -> Siffixes 並在Suffix Dn欄位輸入"o=ibm, c=us",然後再點選Update,成功後會如下圖所示

        步驟三:

        點選畫面中的restart the server,重新啟動IBM SecureWay Directory

        步驟四:

        我們經由開始 -> 程式集 -> IBM SecureWay Directory -> 目錄管理工具 開啟Client介面,開啟之後點選畫面中的"重新整理",選擇"鑑別",一樣輸入管理者的帳號密碼,進行登入的動作

        步驟五:

        再來點選重新整理目錄樹(會跳出一警告視窗,請按確定即可),點選"新增",在項目類型選擇"組織",母項DN保持空白,項目RDN輸入"o=ibm, c=us",然後點選確定

        步驟六:

        接下來,IBM SecureWay Directory會跳出一個畫面,要求您輸入該Entry的其他資料,此部分可不輸入,點選確定即可新增動作

        步驟七:

        再來我們在我們剛剛所建立的Entry底下,再建立一筆人的資料,首先先點選重新整理目錄樹,然後在?o=ibm, c=us?底下點選新增,在項目類型選擇"使用者",母項DN保持不變(即"o=ibm, c=us"),項目RDN輸入"cn=John",然後點選確定

        步驟八:

        一樣,IBM SecureWay Directory依然會跳出一個畫面,要求您輸入該Entry的其他資料,然後我們選擇在sn(姓氏)欄位輸入"Smith",在userPassword欄位輸入"user"(系統會使用星號做表示),如下圖

        步驟九:

        至此我們已經完成新增資料的動作,在一次點選重新整理目錄樹,我們便可以看到在"o=ibm, c=us"底下有一筆"cn=John"的資料

JNDI程式範例

        在資料建立完成後,接著我們透過一之程式範例來解說JNDI是如何與Directory Service進行連結與運作

import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.DirContext;
import javax.naming.directory.Attributes;
import javax.naming.NamingException;
class JNDIsample2 
{
 public static void main(String[] args) 
 {
  try {
   Hashtable env = new Hashtable();
   env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
   env.put(Context.PROVIDER_URL, "ldap://localhost:389/");
   DirContext ctx = new InitialDirContext(env);
   Attributes attrs = ctx.getAttributes("cn = John,o=ibm,c=us");
   System.out.println("sn: " + attrs.get("sn").get());

  } catch (NamingException e) {
    System.err.println("Problem getting attribute:" + e);
  }
 }
}

        這支程式的主要目的是取出我們剛剛建立cn=John這筆資料中的sn欄位的資料,首先我們可以看到這段程式碼

Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:389/");


        一旦Hashtable環境被正確的建構之後,我們就可以案例化一個新的DirContext,以便於建立一個LDAP服務給Java應用程式使用

DirContext ctx = new InitialDirContext(env);


        接著我們指定我們欲搜尋資料的DN

Attributes attrs = ctx.getAttributes("cn = John,o=ibm,c=us");


        並指定我們欲取出欄位的名稱,利用JNDI的Java API,我們便能夠從一個提供Directory Service將我們所需的資訊給索取出來。

System.out.println("sn: " + attrs.get("sn").get());


後記

        JNDI的使用,與一般我們使用Java SQL API的感覺很相像,首先我們必須指定廠商Driver,接著指定連結位置,再來給定條件,最後取出我們所需的資訊,Directory Service的強大在本範例中,並不能很明顯的看出,但是我們透過JNDI的標準,我們可以了解到使用Directory Service的簡易與便利性。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值