起因:
客户说要弄一个单点登录,聊到最后实现方式是这种:
经过:
一系列的cvcvcvcvcv:
public static boolean connect(String host, String post, String username, String password) {
log.info("host,{},post,{},username,{},password,{}", host, post, username, password);
DirContext ctx = null;
Hashtable<String, String> HashEnv = new Hashtable<String, String>();
// LDAP访问安全级别(none,simple,strong)
HashEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
//AD的用户名
HashEnv.put(Context.SECURITY_PRINCIPAL, username);
//AD的密码
HashEnv.put(Context.SECURITY_CREDENTIALS, password);
// LDAP工厂类
HashEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
//连接超时设置为3秒
HashEnv.put("com.sun.jndi.ldap.connect.timeout", "3000");
// 默认端口389
HashEnv.put(Context.PROVIDER_URL, "ldap://" + host + ":" + post);
try {
// 初始化上下文
ctx = new InitialDirContext(HashEnv);
log.info("身份验证成功 !");
return true;
} catch (AuthenticationException e) {
log.error("身份验证失败 !");
log.error(e.getMessage(), e);
return false;
} catch (javax.naming.CommunicationException e) {
log.error("AD域连接失败 !");
log.error(e.getMessage(), e);
return false;
} catch (Exception e) {
log.error("身份验证未知异常 !");
log.error(e.getMessage(), e);
return false;
} finally {
if (null != ctx) {
try {
ctx.close();
ctx = null;
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}
}
结果:
客户说默认端口389不行,得636;
我百度了下389是只能执行查询操作,636增删改查都可以.
我心里肯定不服啊,妈的,老子就是去执行查询来验证下当前用户是否存在即可,搞几把那么复杂干嘛???
但是本着客户是上帝的原则,我又开始了百度…(soon later);
结果02:
636端口是需要使用证书的, 那么问题来了, 证书从哪里搞???
按照我以往的经验,证书在浏览器里面是可以下载的, but 是需要访问网站的哇. 这几把怎么搞出来证书???
好了,马上6点该下班了,今天就先到这里吧.
2020.09.25
圈里一哥们做过这种ldap的客户对接,说他那个证书是客户提供的.
我问了我的客户,一问三不知的,索性不弄证书了,用默认端口了.
客户那改主意了,他们不想暴露ip到公网,所以 这个ldap的不做了.
欧耶!!!