1.LDAP介绍
LDAP,(Light Directory Access Protocol),基于X.500标准的轻量级目录访问协议,类似于目录服务一样,是一个为查询浏览和搜索的数据库,优势在于他的数据存储结构,即树状结构组织数据,他的读性能高,写性能差,不支持事务功能。
LDAP目录服务是由目录数据库和一套访问协议组成的协议(ssl (port:389) / ssh (port:636)),不同的协议端口不一致。
2.LDAP登录实现原理
每一个登录,连接请求去发送本地的用户、密码给LDAP服务器,然后在LDAP服务器上进行匹配,然后判断是否可以通过认证。
3. LDAP配置代码
private LdapContext getLdapContext() {
EnterpriseLDAPConfig config = new EnterpriseLDAPConfig()
.baseDN("dc=fanuc,dc=com")
.ip("106.38.46.129").port("389")
.username("cn=Manager,dc=fanuc,dc=com")
.password(IdsBase64Utils.encrypt("secret"));
LDAPConnector ldapConnector = new LDAPConnector(config);
assertNotNull(ldapConnector);
return ldapConnector.connect();
}
/**
* 根据 配置 初始化LDAP的连接
*
*/
public class LDAPConnector extends AbstractLdapHandler {
private static final Logger LOG = LoggerFactory.getLogger(LDAPConnector.class);
private EnterpriseLDAPConfig ldapConfig;
public LDAPConnector(EnterpriseLDAPConfig ldapConfig) {
this.ldapConfig = ldapConfig;
}
public LdapContext connect() {
return connect(ldapConfig.baseDN());
}
public LdapContext connect(String baseDN) {
baseDN = formatDN(baseDN);
String url = createUrl(ldapConfig.ip(), ldapConfig.port(), baseDN);
Hashtable env = initialEnv(url, ldapConfig.username(), IdsBase64Utils.decrypt(ldapConfig.password()));
try {
if (ldapConfig.connType().equals(LDAPConnType.SSL)){
env.put(Context.SECURITY_PROTOCOL, "ssl");
}
return new InitialLdapContext(env, null);
} catch (NamingException e) {
LOG.warn("Initial LDAPContext failed, url: " + url, e);
return null;
}
}
public abstract class AbstractLdapHandler {
public static final String LDAP_START = "ldap://";
/**
* ldap://12.2.3.44:389/dc=idsmanager,DC=com
*/
String createUrl(String ip, String port, String baseDN) {
return LDAP_START + ip + ":" + port + "/" + baseDN;
}
/**
* 初始化配置参数
*/
Hashtable initialEnv(String url, String userDN, String pwd) {
Hashtable env = new Hashtable<>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, url);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, userDN);
env.put(Context.SECURITY_CREDENTIALS, pwd);
//支持 解析 AD中的 objectGUID
env.put("java.naming.ldap.attributes.binary", "objectGUID");
return env;
}
//其中env中的所需如下
String INITIAL_CONTEXT_FACTORY = "java.naming.factory.initial";
String PROVIDER_URL = "java.naming.provider.url";
String SECURITY_AUTHENTICATION = "java.naming.security.authentication";
String SECURITY_PRINCIPAL = "java.naming.security.principal";
String SECURITY_CREDENTIALS = "java.naming.security.credentials";