Java,LDAP:使其不忽略空白密码吗?
问题内容:
我正在维护一些旧版Java LDAP代码。我几乎不了解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
问题答案:
不幸的是,使用DN和空密码进行身份验证是LDAP的一大难题,并导致服务器发出“未经身份验证”的肯定响应。某些LDAP服务器具有配置选项以禁用该行为,该行为在LDAPv3的最新版本(RFC
4511)中不建议使用,甚至默认情况下也被禁用。
最终,客户端应用程序应检查输入参数,并确保密码不为空。
亲切的问候,
鲁多维奇