現在、Javaから次のコードでLDAPに接続しています。これは非常に典型的な例です。
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, url);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, user);
env.put(Context.SECURITY_CREDENTIALS, password);
LdapContext ctx = null;
try
{
ctx = new InitialLdapContext(env, null);
return true;
}
catch (NamingException ex)
{
return false;
}
finally
{
if (ctx != null)
{
try {
ctx.close();
} catch (NamingException e) {
log.warn(e.getMessage());
}
}
}
これは、ユーザーの認証に関して機能します。ただし、LDAP管理者は、バインドが成功しなかった場合、正常に切断していないと言っています。LDAP側のエラーは次のとおりです(例):
[24 / Jan / 2013:13:20:44 -0500] conn = 249 op = -1 msgId =-1-[ipaddress]から閉じています:44724-A1-クライアントが接続を中止しました-
彼はまた、それが成功した認証であるとき、切断は優雅であると言います。ctx.close()
そういう状況でやっているからだと思います。
ただし、認証が失敗すると、実際にはnew InitialLdapContext(env, null)
回線から例外がスローされます。したがって、コンテキストは返されず、どのコンテキストでもcloseは呼び出されません。
認証を試みる前に、ある種の接続オブジェクトを取得して、認証が成功したかどうかに関係なく、後でそれを閉じることができるようにする方法はありますか?