LDAP
LDAP
一、什么是LDAP?
(一)目录服务
https://www.cnblogs.com/wilburxu/p/9174353.html
-
目录服务是一个特殊的数据库,用来保存描述性的、基于属性的详细信息,支持过滤功能。
-
是动态的,灵活的,易扩展的。
如:人员组织管理,电话簿,地址簿。
(二)LDAP
-
LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问协议。
-
目录是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目录一样。
-
目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。所以目录天生是用来查询的,就好象它的名字一样。
-
LDAP目录服务是由目录数据库和一套访问协议组成的系统。
二、LDAP的主要产品
| 厂商 | 产品 | 介绍 |
| ---------- | -------------------------- | ------------------------------------------------------------ |
| SUN | SUNONE Directory Server | 基于文本数据库的存储,速度快 。 |
| IBM | IBM Directory Server | 基于DB2 的的数据库,速度一般。 |
| Novell | Novell Directory Server | 基于文本数据库的存储,速度快, 不常用到。 |
| Microsoft | Microsoft Active Directory | 基于WINDOWS系统用户,对大数据量处理速度一般,但维护容易,生态圈大,管理相对简单。 |
| Opensource | Opensource | OpenLDAP 开源的项目,速度很快,但是非主 流应用。 |
三、LDAP的基本概念
| 关键字 | 英文全称 | 含义 |
| ---------- | ------------------ | ------------------------------------------------------------ |
| dc | Domain Component | 域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com(一条记录的所属位置) |
| uid | User Id | 用户ID songtao.xu(一条记录的ID) |
| ou | Organization Unit | 组织单位,组织单位可以包含其他各种对象(包括其他组织单元),如“oa组”(一条记录的所属组织) |
| cn | Common Name | 公共名称,如“Thomas Johansson”(一条记录的名称) |
| sn | Surname | 姓,如“许” |
| dn | Distinguished Name | “uid=songtao.xu,ou=oa组,dc=example,dc=com”,一条记录的位置(唯一) |
| rdn | Relative dn | 相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn= Thomas Johansson” |
四、java 实现 增删改查
package com.dist;
import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.Control;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;
import java.util.Hashtable;
public class LDAPAuthentication {
private final static String URL = "ldap://MSI:389/";
private final static String BASEDN = "dc=dist"; // 根据自己情况进行修改
private final static String FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";
private static LdapContext ctx = null;
private final static Control[] connCtls = null;
private static void LDAP_connect() {
Hashtable<String, String> env = new Hashtable<>();
env.put(Context.INITIAL_CONTEXT_FACTORY, FACTORY);
env.put(Context.PROVIDER_URL, URL + BASEDN);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
String root = "cn=Manager"; //根据自己情况修改
env.put(Context.SECURITY_PRINCIPAL, root); // 管理员
env.put(Context.SECURITY_CREDENTIALS, "abc"); // 管理员密码
try {
ctx = new InitialLdapContext(env, connCtls);
System.out.println( "连接成功" );
} catch (javax.naming.AuthenticationException e) {
System.out.println("连接失败:");
e.printStackTrace();
} catch (Exception e) {
System.out.println("连接出错:");
e.printStackTrace();
}
}
private void closeContext(){
if (ctx != null) {
try {
ctx.close();
}
catch (NamingException e) {
e.printStackTrace();
}
}
}
private static String getUserDN(String uid) {
String userDN = "";
LDAP_connect();
try {
SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration<SearchResult> en = ctx.search("", "uid=" + uid, constraints);
if (en == null || !en.hasMoreElements()) {
System.out.println("未找到该用户");
}
// maybe more than one element
while (en != null && en.hasMoreElements()) {
Object obj = en.nextElement();
if (obj instanceof SearchResult) {
SearchResult si = (SearchResult) obj;
userDN += si.getName();
userDN += "," + BASEDN;
System.out.println(userDN);
} else {
System.out.println(obj);
}
}
} catch (Exception e) {
System.out.println("查找用户时产生异常。");
e.printStackTrace();
}
return userDN;
}
public boolean authenricate(String UID, String password) {
boolean valide = false;
String userDN = getUserDN(UID);
try {
ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN);
ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password);
ctx.reconnect(connCtls);
System.out.println(userDN + " 验证通过");
valide = true;
} catch (AuthenticationException e) {
System.out.println(userDN + " 验证失败");
System.out.println(e.toString());
valide = false;
} catch (NamingException e) {
System.out.println(userDN + " 验证失败");
valide = false;
}
closeContext();
return valide;
}
private boolean addUser(String usr, String pwd) {
try {
LDAP_connect();
BasicAttributes attrsbu = new BasicAttributes();
BasicAttribute objclassSet = new BasicAttribute("objectclass");
objclassSet.add("inetOrgPerson");
attrsbu.put(objclassSet);
attrsbu.put("sn", usr);
attrsbu.put("cn", usr);
attrsbu.put("uid", usr);
attrsbu.put("userPassword", pwd);
ctx.createSubcontext("uid="+usr, attrsbu);
return true;
} catch (NamingException ex) {
ex.printStackTrace();
}
closeContext();
return false;
}
public static void main(String[] args) {
LDAPAuthentication ldap = new LDAPAuthentication();
ldap.LDAP_connect();
ldap.getUserDN("admin-c");
if(ldap.authenricate("admin-s", "pass") == true){
System.out.println( "该用户认证成功" );
}
ldap.addUser("pengtest","123456");
getUserDN("admin-s");
}
}