InitialDirContext

LDAPサーバに登録されたユーザオブジェクトをパスワードで認証するのに,JavaのJNDIを使って以下のように書きました。

Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://host/o=foo");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "uid=bar,ou=people,o=foo");
env.put(Context.SECURITY_CREDENTIALS, "secret");

try {
    DirContext ctx = new InitialDirContext(env);
    // success
} catch (AuthenticationException ex) {
    // authentication fail
} catch (NamingException ex) {
    // another naming exception
}

InitialDirContextの生成時にSECURITY_PRINCIPALをSECURITY_CREDENTIALSで認証して,それが失敗すればAuthenticationExceptionが出ます。この時注意するのは,SECURITY_PRINCIPALには,PROVIDER_URLのベースDN(ここでは,o=fooの部分)も含めて,フルパスで書く必要があるということです。uid=barだけを指定するのじゃダメで,オブジェクトが見つからないというエラーになります(はまりました)。