便利なコードパーツ集!

やまろうのプログラミングTips

Java

JavaでLDAPアクセスのライブラリを作る 〜 ディレクトリ属性の取得

投稿日:

2004/02
まずLDAPってなんやねん?ということですが、簡単にいうと階層型データベースです。
ディレクトリ構造でデータを管理するソフトウェアなわけですが、よくある
使われ方はシステムを使用するユーザの情報の管理です。ユーザIDやパスワード
なんかね。今回はLDAPからディレクトリ属性を取得する処理を作ります。

LDAPからディレクトリ属性を取得するには、
1.DirContextを取得。
2. 取得したDirContextのgetAttributes(キーとなる文字列)を呼び出す。
をおこないます。
で1を行うDirContextFactoryクラスと2を行うGetAttributesCommandクラス
を作成しました。

んじゃ、ソースいってみよう!

package jp.gr.java_conf.yamarou.ldap;

import java.util.Properties;
import java.io.InputStream;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.Context;

/**
 * DirContextを生成するクラス。
 * 一度生成したらキャッシュし、使いまわす。
 * @author yamarou
 */
public class DirContextFactory {
  /** キャッシュするDirContext */
  private static DirContext context = createDirContext();

  /**
   * ldap.propertiesを読み込み、読み込んだ情報を使用して
   * LDAPからユーザ情報ディレクトリのコンテキストを取得する。
   * コンテキストを一度取得したら保持し、以降はそれを返す。
   * @return ディレクトリコンテキスト
   */
  public static DirContext getDirContext() {
    return context;
  }

  private static DirContext createDirContext() {
    try {
      Properties env = new Properties();
      InputStream in = env.getClass().getResourceAsStream(
          "/ldap.properties");
      env.load(in);
      return new InitialDirContext(env);
    } catch (Exception ex) {
      throw new RuntimeException(ex);
    }
  }
}

package jp.gr.java_conf.yamarou.ldap;

import javax.naming.directory.Attributes;
import javax.naming.directory.Attribute;
import javax.naming.directory.DirContext;
import javax.naming.NamingException;
import javax.naming.NamingEnumeration;

/**
 * LDAPの属性を取得するクラス。
 * @author yamarou
 */
public class GetAttributesCommand {
  private Attributes attrs;

  public GetAttributesCommand() {
  }

  /**
   * nameのAttributesを取得し保持する。
   * @param name ディレクトリ名
   */
  public void execute(String name) {
    try {
      DirContext context = DirContextFactory.getDirContext();
      attrs = context.getAttributes(name);
      for (NamingEnumeration e = attrs.getAll();e.hasMore();) {
        System.out.println("enum="+e.next());
      }
    } catch (Exception ex) {
      throw new RuntimeException(ex);
    }
  }

  /**
   * 属性値を返す。
   * @param attrID 属性ID
   * @return 属性値
   */
  public Object getObject(String attrID) {
    try {
      Attribute attr = this.attrs.get(attrID);
      if (attr == null) {
        return null;
      }
      return attr.get();
    } catch (NamingException ex) {
      throw new RuntimeException(ex);
    }
  }

  /**
   * 属性値を返す。
   * @param attrID 属性ID
   * @return 属性値
   */
  public String getString(String attrID) {
    return (String)getObject(attrID);
  }

  /**
   * 属性値を返す。
   * @param attrID 属性ID
   * @return 属性値
   */
  public byte[] getBytes(String attrID) {
    return (byte[])getObject(attrID);
  }
}

package jp.gr.java_conf.yamarou.ldap;

import junit.framework.*;

public class GetAttributesCommandTest
    extends TestCase {

  public GetAttributesCommandTest(String name) {
    super(name);
  }

  public void testGetString() {
    GetAttributesCommand get = new GetAttributesCommand();
    get.execute("uid=USER001");
    String uid = get.getString("uid");
    assertEquals("USER001", uid);
    String cn = get.getString("cn");
    assertEquals("cn00001", cn);
  }

}

実行には以下のファイル(ldap.properties)をクラスパス上に
配置しておくことが必要です。実行する環境に合わせて変更して下さい。

[ldap.properties]

java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory
java.naming.provider.url=ldap://localhost/ou=user,o=yamarou.co.jp
java.naming.security.authentication=simple
java.naming.security.principal=cn=Directory Manager
java.naming.security.credentials=password

GetAttributesCommandの使い方は
GetAttributesCommandTestクラスを見ていただくとわかるのですが、
GetAttributesCommandを

newして、
executeして
各属性をgetする

というものになっています。簡単でしょ!

DirContext#getAttributes(String name)を隠蔽してるってわけです。
Command自体にAttributesを持たすか、それとも
executeでAttributesをラップしたクラスを返すか迷ったのですが
とりあえず一つのクラスでカプセル化することにしました。

次回はLDAP更新系ライブラリを作ってみたいと思います。お楽しみに!

やまろう

スポンサーリンク

-Java

Copyright© やまろうのプログラミングTips , 2022 AllRights Reserved Powered by AFFINGER4.