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.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更新系ライブラリを作ってみたいと思います。お楽しみに!
やまろう