1

この種の接続を行うことは、すべてがユーザーに問題がない場合に機能するようです

Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
props.setProperty(Context.PROVIDER_URL, someUrl);
props.setProperty(Context.SECURITY_PRINCIPAL, commonName);
props.setProperty(Context.SECURITY_CREDENTIALS, password);

InitialLdapContext ctx = null;
try {
    ctx = new InitialLdapContext(props, null);
    return true;
} catch (javax.naming.AuthenticationException ex) {
    ex.printStackTrace();
} catch (NamingException ex) {
     logger.warn("LDAP NamingException looking for user - " + 
          username + ": " + ex.getMessage(), ex);
}
return false;

しかし、ユーザーが無効な場合は、javax.naming.AuthenticationException: LDAP: error code 49 のようなエラーが発生するだけで、無効なパスと期限切れのアカウントなどの違いがわかりません。

代わりに再接続を試みてから getResponseControls() を実行して、実際に発生した詳細なエラーにアクセスできることを読みました。

Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
props.setProperty(Context.PROVIDER_URL, someUrl);

InitialLdapContext ctx = null;
try {
    ctx = new InitialLdapContext(props, null);
    // set the user/pass they entered
    ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, commonName);
    ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password);
    Hashtable env = new Hashtable();
    ctx.reconnect(null);
    return true;
} catch (javax.naming.AuthenticationException ex) {
    ex.printStackTrace();
    try {
       Control[] controls = ctx.getResponseControls();
       if (controls == null) {
          logger.debug("response controls  = null", ex);
       } else {
           logger.debug("response controls  = " + controls.toString(), ex);
       }
   } catch (NamingException ex1) {
       logger.error("error decoding respponsecontrols", ex);
   }
   return false;
} catch (NamingException ex) {
     logger.warn("LDAP NamingException looking for user - " + 
          username + ": " + ex.getMessage(), ex);
}

しかし、これを行うと、コントロールは null になります。

誰もこれを成功させたことがありますか?

4

1 に答える 1