いくつかのレガシーJavaLDAPコードを維持しています。LDAPについてはほとんど何も知りません。
以下のプログラムは、基本的にユーザーIDとパスワードをLDAPサーバーに送信し、資格情報が適切かどうかを通知します。その場合、LDAPサーバーから受信したLDAP属性を出力し、そうでない場合は例外を出力します。
間違ったパスワードが与えられた場合、すべてがうまく機能します。「無効な資格情報」例外がスローされます。ただし、空白のパスワードがLDAPサーバーに送信された場合でも、認証は行われ、LDAP属性は引き続き返されます。
LDAPサーバーが空白のパスワードを許可しているためにこの不幸な状況ですか、それとも以下のコードを調整する必要がありますか?空白のパスワードがLDAPサーバーに送られ、拒否されますか?
私はデータ検証を実施しています。別の問題を解決するためにテスト環境でそれを外し、この問題に気づきました。私は、データ検証の下でこの問題が発生しないようにしたいと思います。
情報をよろしくお願いします
import javax.naming.*;
import javax.naming.directory.*;
import java.util.*;
import java.sql.*;
public class LDAPTEST {
public static void main(String args[]) {
String lcf = "com.sun.jndi.ldap.LdapCtxFactory";
String ldapurl = "ldaps://ldap-cit.smew.acme.com:636/o=acme.com";
String loginid = "George.Jetson";
String password = "";
DirContext ctx = null;
Hashtable env = new Hashtable();
Attributes attr = null;
Attributes resultsAttrs = null;
SearchResult result = null;
NamingEnumeration results = null;
int iResults = 0;
int iAttributes = 0;
env.put(Context.INITIAL_CONTEXT_FACTORY, lcf);
env.put(Context.PROVIDER_URL, ldapurl);
env.put(Context.SECURITY_PROTOCOL, "ssl");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "uid=" + loginid + ",ou=People,o=acme.com");
env.put(Context.SECURITY_CREDENTIALS, password);
try {
ctx = new InitialDirContext(env);
attr = new BasicAttributes(true);
attr.put(new BasicAttribute("uid",loginid));
results = ctx.search("ou=People",attr);
while (results.hasMore()) {
result = (SearchResult)results.next();
resultsAttrs = result.getAttributes();
for (NamingEnumeration enumAttributes = resultsAttrs.getAll(); enumAttributes.hasMore();) {
Attribute a = (Attribute)enumAttributes.next();
System.out.println("attribute: " + a.getID() + " : " + a.get().toString());
iAttributes++;
}// end for loop
iResults++;
}// end while loop
System.out.println("Records == " + iResults + " Attributes: " + iAttributes);
}// end try
catch (Exception e) {
e.printStackTrace();
}
}// end function main()
}// end class LDAPTEST