目次 | 前の項目 | 次の項目 | JNDI API |
セキュリティ保護されたシステムでは、アクセスするコンピュータ、ネットワーク、サービスへの認証を取得する必要があります。たとえば、UNIX にログインするときは、パスワードを入力する必要があります。また、SSL を使用するときは、X.509 証明書を渡す必要があります。このような認証情報は、ディレクトリ内の各ユーザに関連付けられた属性として格納されます。認証を行うシステムでは、ユーザが入力した情報を使用して、ユーザの属性 (パスワードなど) をルックアップし認証を検証します。
DirContext ctx = new InitialDirContext(); Attribute attr = ctx.getAttributes(userName).get("password"); String password = (String)attr.get();
電子メールシステムでは、ユーザと電子メールアドレスのマップを行うためのディレクトリサービスを使用できます。電子メールのユーザは、この機能を使用して特定のユーザの電子メールアドレスを検索できます。この操作は、電話をかけるときに電話帳で特定の電話番号を検索することと似ています。たとえば、同じ部署内の「John Smith」にメールを送信する場合は、メールアプリケーションの「検索」ウィジェットを使用して、そのディレクトリで「John Smith」を検索します。このウィジェットによって、5 つの「John Smith」エントリが返されます。 その中から、同一職場の建物にあるエントリを選択し、そのエントリに関連付けられた電子メールアドレス属性を使用します。
NamingEnumeration matches = deptCtx.search("user", new BasicAttributes("name", "John Smith")); // use matches to construct a selectable list for end-user while (matches.hasMore()) { SearchResult item = (SearchResult) matches.next(); Attributes info = item.getAttributes(); /* display attributes */ ... }このディレクトリを使用して、個人アドレス帳を設定することもできます。たとえば、「John Smith」の電子メールアドレスを一度特定したら、メールを送信するたびにディレクトリを繰り返し検索しないようにすることができます。ディレクトリ内に、頻繁に使用するエントリを管理するための個人用サブツリーを作成します。 多くの場合、既存のエントリへのリンクを作成します。
データベースアプリケーションから、ディレクトリを使用してデータベースサーバを検索することができます。たとえば、財務アプリケーションでは、JDBC を使用している株式相場サーバから株式相場を取得する必要があります。この財務アプリケーションで、いくつかの属性 (その市場の範囲および相場の更新頻度など) を指定して株式相場サーバを選択することができます。このアプリケーションによって、これらの属性と一致する相場サーバがディレクトリで検索されます。 次に、選択された相場サーバの「位置」属性 (JDBC URL) が取得され、そのサーバに接続されます。
NamingEnumeration matches = ctx.search("service/stockQuotes", "(&(market=NASDAQ)(updateFreqency<=300))", searchctls); while (matches.hasMore()) { SearchResult item = (SearchResult)matches.next(); Attribute location = item.getAttributes().get("location"); ... }
ユーザに名前の入力を要求する対話型アプリケーションでは、名前空間ブラウザを使用できると入力が容易になります。名前空間ブラウザは、アプリケーションに組み込んでそのアプリケーション用に調整することもできますが、通常の Web ブラウザなどとして汎用的に使用することもできます。
単純な JNDI ブラウザの場合は、ステップごとに基本名を表示しながら名前空間を参照することができます。各
Context
の名前に「*」を表示して、次に移動できる場所を示しています。 1// Start at the top -- the initial context. Context ctx = new InitialContext(); while (ctx != null) { // display one level NamingEnumeration items = ctx.list(); while (items.hasMoreElements()) { NameClassPair item = (NameClassPair)items.next(); if (isContext(item.getClassName())) { System.out.print("*"); } else { System.out.print(" "); } System.out.println(" " + item.getName()); } // Take the next step down into the namespace. String target = input.readLine(); try { ctx = (Context)ctx.lookup(target); } catch (NamingException e) { // handle error } catch (ClassCastException e) { // not a context; cannot traverse } }
印刷サービスでは、ユーザがネットワーク内でプリンタを容易に特定して選択できることが重要です。印刷が行われるアプリケーションまたはそのアプリケーションが実行されているマシンは、新しいプリンタがネットワークに追加されるたびに設定する必要がないようにしなければなりません。プリンタへのネットワークアクセスのスコープには、ワークグループからグローバルまでさまざまなものがあります。印刷サービスでは、この機能を提供するときにディレクトリが使用されます。
プリンタは、
Printer
インタフェースで表現されます。このインタフェースのメソッドの 1 つに、print()
があります。 このメソッドでは、指定されたInputStream
からデータが読み取られます。 読み取られたデータは、Printer
のインスタンスで表現されるプリンタ上に出力されます。interface Printer { void print(InputStream data) throws PrinterException; ... }ユーザは、論理プリンタ名を使用して、明示的にまたはデフォルト設定からプリンタを選択します。たとえば、すべてのアプリケーションに対してデフォルトプリンタを指定した場合、この設定は、ほかのプリンタを明示的に指定したときにだけオーバーライドされます。印刷要求を受け入れたアプリケーションでは、そのプリンタ名を受け取り、ディレクトリサービス内でルックアップします。この結果、
Printer
インタフェースを実装しているオブジェクトを受け取ります。void myAppPrint(String printerName, String fileName) throws IOException { try { DirContext ctx = new InitialDirContext(); Printer prt = (Printer) ctx.lookup(printerName); prt.print(new FileInputStream(fileName)); } catch (NamingException e){ System.err.println("Could not locate printer: " + e); } catch (ClassCastException e) { System.err.println(printerName + "does not name a printer"); } }7.5.1 プリンタのブラウズと検索
明示的に名前を指定してプリンタを選択しないで、プリンタを特定する方法があります。ディレクトリを使用すれば、使用可能なさまざまなプリンタを表示したり (ブラウズ機能)、特定の属性を持つプリンタを検索したりすることができます。たとえば、ディレクトリに対して、Mountain View キャンパスの 5 番ビルの 2 階にあるすべてのプリンタの一覧表示、または 600dpi の解像度を持つすべてのカラーレーザプリンタの検索を要求できます。アプリケーションから見ると、一覧表示および検索操作を使用した場合でも、
lookup()
と同じように、Printer
オブジェクトを返す機能が提供されます。Printer
オブジェクトは、アプリケーションから印刷要求を送信するときに使用できます。