import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
public class LdapService {
// LDAP 服务器的 URL 地址,TODO: 换为你的真实服务器地址
private final String LDAP_URL = "ldap://www.xxx.yyy.zzz:389";
/**
* LDAP 验证用户登录
*/
public boolean authenticate(final String userName, final String password) {
// env 中的 key 都是固定值,在 javax.naming.Context 类中
final Hashtable<String, String> env = new Hashtable<String, String>(4);
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, LDAP_URL); // ldapURL
env.put(Context.SECURITY_AUTHENTICATION, "simple"); // ldapAuthMode
// 连接的主要凭证就是此处的 dn,这个东东非常坑,大部分人都在这儿会栽进去。
// 要点在于,dn 要完整!然鹅,大部分程序员不知道什么样才是一个完整的 dn,
// 我的经验是,打开 LDAP Account Manager,使用“树状结构”展示,选中任一
// 用户均会显示出其完整的 dn。
String dn = "cn=" + userName + ",ou=People,dc=chainsguard,dc=com";
env.put(Context.SECURITY_PRINCIPAL, dn);
env.put(Context.SECURITY_CREDENTIALS, password);
boolean ret = false;
DirContext ctx = null;
try {
// 这条代码执行成功就是验证通过
ctx = new InitialDirContext(env);
ret = true;
} catch (final Exception e) {
System.out.println(e.getMessage());
} finally {
try {
if (ctx != null) {
ctx.close();
ctx = null;
}
env.clear();
} catch (final Exception e) {
}
}
return ret;
}
public static void main(String args[]) {
final LdapService ldap = new LdapService();
final Boolean succeeded = ldap.authenticate(
"renwoxing", "12345654321" // TODO: 换用你的用户凭证
);
System.out.println(succeeded ? "That's OK!" : "That's NOT OK!");
}
}