java操作ladp数据

安装:
https://www.cnblogs.com/lemon-le/p/6266921.html
安装完不能添加用户:
http://www.live-in.org/archives/1731.html

ladp:只需要知道是一种协议,以目录的形式(结构树)来管理资原(用户、用户组、地址簿、邮件用户等)。
一些大公司会选择以LDAP来存储用户及其信息。
所以就像是数据库一般,LDAP也是有client端和server端。server端是用来存放资源,client端用来操作增删改查等操作。

Objectclass
LDAP对象类,是LDAP内置的数据模型。每种objectClass有自己的数据结构,比如我们有一种叫“电话薄”的objectClass,肯定会内置很多属性(attributes),如姓名(uid),身份证号(uidNumber),单位名称(gid),家庭地址(homeDirectory)等,同时,还有一种叫“同学录”的objectClass,具备“电话薄”里的一些attributes(如uid、homeDirectory),还会具有“电话薄”没有的attributes(如description等)。

objectClass可分为以下3类:
结构型(Structural) :如person和organizationUnit;
辅助型(Auxiliary) :如extensibeObject;
抽象型(Abstract) :如top,抽象型的objectClass不能直接使用。

在OpenLDAP的schema中定义了很多objectClass,下面列出部分常用的objectClass的名称。
● account
● alias
● dcobject
● domain
● ipHost
● organization
● organizationalRole
● organizationalUnit
● person
● organizationalPerson
● inetOrgPerson
● residentialPerson
● posixAccount
● posixGroup

属性:
●dn 唯一标识 用户登陆ldap的账号
● c:国家。
● cn:common name,指一个对象的名字。如果指人,需要使用其全名。
● dc:domain Component,常用来指一个域名的一部分。
● givenName:指一个人的名字,不能用来指姓。
● l:指一个地名,如一个城市或者其他地理区域的名字。
● mail:电子信箱地址。
● o:organizationName,指一个组织的名字。
● ou:organizationalUnitName,指一个组织单元的名字。
● sn:surname,指一个人的姓。
● telephoneNumber:电话号码,应该带有所在的国家的代码。
● uid:User Name,通常指某个用户的登录名,与Linux系统中用户的uid不同。账号(第三方应用)
● gidNumber:为GroupId,即组ID,用来标识用户组的唯一标识符
● uidNumber 身份证号

下面列出部分常用objectClass要求必设的属性:
● account:userid。
● organization:o。
● person:cn和sn。
● organizationalPerson:与person相同。
● organizationalRole:cn。
● organizationUnit:ou。
● posixGroup:cn、gidNumber。
● posixAccount:cn、gidNumber、homeDirectory、uid、uidNumber。

import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.*;
import javax.naming.ldap.Control;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;
import java.util.Hashtable;
import java.util.Vector;

public class test {
	private final String URL = "ldap://39.xxx.xx.xx:389/";	 // 根据自己情况进行修改
	private final String BASEDN = "dc=ldap,dc=tydic,dc=org";  // 根据自己情况进行修改,根目录
	private final String FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";
	private LdapContext ctx = null;
	private final Control[] connCtls = null;

	public static void main(String[] args) throws Exception {

		test ldap = new test();

		//连接ldap
		ldap.LDAP_connect();

		//查询节点
//		System.out.println(ldap.getUserOrUserGroup("ljp"));
		//遍历节点
//		base :根节点(在这里是"dc=example,dc=com")
//		scope :搜索范围,分为"base"(本节点),"one"(单层),""(全部节点遍历)
//		filter :指定子节点(格式为"(objectclass=*)",*是指全部,你也可以指定某一特定类型的树节点)
//		ldap.searchInformation(ldap.BASEDN,"base","(objectClass=*)");

		//添加组
//		System.out.println(ldap.addUserGroup("harvey","posixGroup"));
//		System.out.println(ldap.addUserGroup("harvey1","organizationalUnit"));
//		System.out.println(ldap.addUserGroup("harvey2","organizationalRole"));
		//添加用户
//		System.out.println(ldap.addUser("czj333","123456"));
		//重命名,组,用户
//		System.out.println(ldap.renameEntry("cn=harvey,dc=ldap,dc=tydic,dc=org","cn=1232132,dc=ldap,dc=tydic,dc=org"));
//		System.out.println(ldap.renameEntry("uid=czj333,dc=ldap,dc=tydic,dc=org","uid=liuzh,dc=ldap,dc=tydic,dc=org"));
		//删除  组  用户
//		System.out.println(ldap.delete("uid=liuzh,dc=ldap,dc=tydic,dc=org"));
// 		System.out.println(ldap.delete("cn=1232132,dc=ldap,dc=tydic,dc=org"));
		//添加属性(注意邮箱属性是:mail,ldap页面上显示的是中文)
//		添加属性,如果一个属性不存在,则新添加一个属性,并赋值,如果一个属性已经存在,则再次赋值,就是一个属性可以有多个值
		System.out.println(ldap.addAttribute("uid=czj333,dc=ldap,dc=tydic,dc=org","mail","123456"));
		//修改属性
//		System.out.println(ldap.modifyAttribute("uid=czj333,dc=ldap,dc=tydic,dc=org","title","123456"));
		//删除属性
//		System.out.println(ldap.deleteAttribute("uid=czj333,dc=ldap,dc=tydic,dc=org","title"));

		//关闭连接
		ldap.closeContext();
	}
	/**
	 * 连接ldap
 	 */
	private void LDAP_connect() {
		Hashtable<String, String> env = new Hashtable<String, String>();
		env.put(Context.INITIAL_CONTEXT_FACTORY, FACTORY);
		env.put(Context.PROVIDER_URL, URL);
		env.put(Context.SECURITY_AUTHENTICATION, "simple");

		String root = "cn=admin,dc=ldap,dc=tydic,dc=org";  //根据自己情况修改
		env.put(Context.SECURITY_PRINCIPAL, root);   // 管理员
		env.put(Context.SECURITY_CREDENTIALS, "123456");  // 管理员密码   // 根据自己情况进行修改

		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();
		}

	}
	/**
	 * ldap连接关闭
	 */
	private void closeContext(){
		if (ctx != null) {
			try {
				ctx.close();
			}
			catch (NamingException e) {
				e.printStackTrace();
			}

		}
	}
	/**
	 * 查询用户或用户组
	 * @param cn
	 * @return
	 */
	private String getUserOrUserGroup(String cn) {
		String userDN = "";
		try {
			SearchControls constraints = new SearchControls();
			constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
			//查找用户,如果查找的是组,en=null
			NamingEnumeration<SearchResult> en = ctx.search(BASEDN, "cn=" + cn, constraints);

			if (en == null || !en.hasMoreElements()) {
				//查找组
				en = ctx.search(BASEDN, "ou=" + cn, 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;
					//操作属性
					Attributes at = si.getAttributes();
					NamingEnumeration ane = at.getAll();
					while (ane.hasMore()) {
						Attribute attr = (Attribute) ane.next();
						String attrType = attr.getID();
						NamingEnumeration values = attr.getAll();
						Vector vals = new Vector();
						while (values.hasMore()) {
							Object oneVal = values.nextElement();
							if (oneVal instanceof String) {
								System.out.println(attrType + ": " + (String) oneVal);
							} else {
								System.out.println(attrType + ": " + new String((byte[]) oneVal));
							}
						}
					}
				} else {
					System.out.println(obj);
				}
			}
		} catch (Exception e) {
			System.out.println("查找用户时产生异常。");
			e.printStackTrace();
		}

		return userDN;
	}
	/**
	 * 添加用户
	 * @param usr
	 * @param pwd
	 * @return
	 */
	private  boolean addUser(String usr, String pwd) {

		try {
			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+","+BASEDN, attrsbu);
			return true;
		} catch (NamingException ex) {
			ex.printStackTrace();
		}
		return false;
	}
	/**
	 * 添加用户组
	 * @return
	 */
	private  boolean addUserGroup(String groupName,String objectClass) {
		try {
			BasicAttributes attrsbu = new BasicAttributes();
			BasicAttribute objclassSet = new BasicAttribute("objectclass");
			//添加objectclass
			objclassSet.add(objectClass);
			objclassSet.add("top");
			attrsbu.put(objclassSet);

			if (objectClass.equals("posixGroup")){
				attrsbu.put("cn", groupName);
				attrsbu.put("gidNumber","507");
				ctx.createSubcontext("cn="+groupName+","+BASEDN,attrsbu);
			}
			else if(objectClass.equals("organizationalUnit")){
				attrsbu.put("ou", groupName);
				ctx.createSubcontext("ou="+groupName+","+BASEDN,attrsbu);
			}
			else if (objectClass.equals("organizationalRole")){
				attrsbu.put("cn", groupName);
				ctx.createSubcontext("cn="+groupName+","+BASEDN,attrsbu);
			}

			return true;

		} catch (NamingException ex) {
			ex.printStackTrace();
		}
		return false;
	}
	/**
	 * 重命名节点
	 * @param oldDN
	 * @param newDN
	 * @return
	 */
	public boolean renameEntry(String oldDN, String newDN) {
		try {
			ctx.rename(oldDN, newDN);
			return true;
		} catch (NamingException ne) {
			System.err.println("Error: " + ne.getMessage());
			return false;
		}
	}
	/**
	 * 删除
	 * @param dn
	 */
	public boolean delete(String dn) {
		try {
			ctx.destroySubcontext(dn);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Exception in delete():" + e);
			return false;
		}
	}
	/**
	 * 添加属性
	 * @param dn 节点
	 * @param attributeName 属性名
	 * @param value 值
	 * @return
	 */
	public boolean addAttribute(String dn,String attributeName,String value) {
		try {
			System.out.println("add...\n");
			ModificationItem[] mods = new ModificationItem[1];
			/* 删除属性 */
// Attribute attr0 = new BasicAttribute("description",
// "陈轶");
// mods[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE,
// attr0);
			/* 添加属性 */
			Attribute attr0 = new BasicAttribute(attributeName,value);
			mods[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE, attr0);
			/* 修改属性 */
			ctx.modifyAttributes(dn, mods);
			return true;
		} catch (NamingException e) {
			e.printStackTrace();
			System.err.println("Error: " + e.getMessage());
			return false;
		}
	}
	/**
	 * 修改属性
	 * @param dn 节点
	 * @param attributeName 属性名
	 * @param value 值
	 * @return
	 */
	public boolean modifyAttribute(String dn,String attributeName,String value) {
		try {
			System.out.println("modify...\n");
			ModificationItem[] mods = new ModificationItem[1];
			/* 修改属性 */
 			Attribute attr0 = new BasicAttribute(attributeName, value);
 			mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attr0);
			/* 修改属性 */
			ctx.modifyAttributes(dn, mods);
			return true;
		} catch (NamingException e) {
			e.printStackTrace();
			System.err.println("Error: " + e.getMessage());
			return false;
		}
	}
	/**
	 * 删除属性
	 * @param dn 节点
	 * @param attributeName 属性名
	 * @param
	 * @return
	 */
	public boolean deleteAttribute(String dn,String attributeName) {
		try {
			System.out.println("delete...\n");
			ModificationItem[] mods = new ModificationItem[1];
			/* 删除属性 */
 			Attribute attr0 = new BasicAttribute(attributeName);
 			mods[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, attr0);
			/* 修改属性 */
			ctx.modifyAttributes(dn, mods);
			return true;
		} catch (NamingException e) {
			e.printStackTrace();
			System.err.println("Error: " + e.getMessage());
			return false;
		}
	}
	/**
	 * @param base :根节点(在这里是"dc=example,dc=com")
	 * @param scope :搜索范围,分为"base"(本节点),"one"(单层),""(遍历)
	 * @param filter :指定子节点(格式为"(objectclass=*)",*是指全部,你也可以指定某一特定类型的树节点)
	 */
	public void searchInformation(String base, String scope, String filter) {
		SearchControls sc = new SearchControls();
		if (scope.equals("base")) {
			sc.setSearchScope(SearchControls.OBJECT_SCOPE);
		} else if (scope.equals("one")) {
			sc.setSearchScope(SearchControls.ONELEVEL_SCOPE);
		} else {
			sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
		}
		NamingEnumeration ne = null;
		try {
			ne = ctx.search(base, filter, sc);
			// Use the NamingEnumeration object to cycle through
			// the result set.
			while (ne.hasMore()) {
				System.out.println();
				SearchResult sr = (SearchResult) ne.next();
				String name = sr.getName();
				if (base != null && !base.equals("")) {
					System.out.println("entry: " + name + "," + base);
				} else {
					System.out.println("entry: " + name);
				}

				Attributes at = sr.getAttributes();
				NamingEnumeration ane = at.getAll();
				while (ane.hasMore()) {
					Attribute attr = (Attribute) ane.next();
					String attrType = attr.getID();
					NamingEnumeration values = attr.getAll();
					Vector vals = new Vector();
					// Another NamingEnumeration object, this time
					// to iterate through attribute values.
					while (values.hasMore()) {
						Object oneVal = values.nextElement();
						if (oneVal instanceof String) {
							System.out.println(attrType + ": " + (String) oneVal);
						} else {
							System.out.println(attrType + ": " + new String((byte[]) oneVal));
						}
					}
				}
			}
		} catch (Exception nex) {
			System.err.println("Error: " + nex.getMessage());
			nex.printStackTrace();
		}
	}

	public UserInfo authenricate(String UID, String password) {
		String userDN = "";
		String uidNumber="";
		UserInfo userInfo=null;

		try {
			SearchControls constraints = new SearchControls();
			constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
			//根据uid查找用户
			NamingEnumeration<SearchResult> en = ctx.search(BASEDN, "uid=" + UID, constraints);

			while (en != null && en.hasMoreElements()) {
				Object obj = en.nextElement();
				if (obj instanceof SearchResult) {
					SearchResult si = (SearchResult) obj;
					userDN += si.getName();
					userDN += "," + BASEDN;

					//获取uidNumber属性
					Attributes attributes = si.getAttributes();
					Attribute attribute = attributes.get("uidNumber");
					uidNumber=attribute.get(0).toString();

					//封装属性
					userInfo=new UserInfo();
					userInfo.setUserId(Long.valueOf(uidNumber));
					userInfo.setLoginName(UID);
					userInfo.setPassword(password);
				}
			}

			ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN);
			ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password);
			ctx.reconnect(connCtls);
			System.out.println(userDN + " 验证通过");

		} catch (AuthenticationException e) {
			System.out.println(userDN + " 验证失败");
			System.out.println(e.toString());
		} catch (NamingException e) {
			System.out.println(userDN + " 验证失败");
		}
		return userInfo;
	}


}

参考:https://jianshi-dlw.iteye.com/blog/1557846
https://blog.csdn.net/binyao02123202/article/details/18697953

好的,以下是在CentOS 7.6上部署LDAP的步骤: 1. 安装OpenLDAP和相关工具: ``` yum install openldap openldap-servers openldap-clients migrationtools -y ``` 2. 配置slapd.conf文件: 编辑/etc/openldap/slapd.conf文件并添加以下内容: ``` include /etc/openldap/schema/core.schema include /etc/openldap/schema/cosine.schema include /etc/openldap/schema/inetorgperson.schema include /etc/openldap/schema/nis.schema pidfile /var/run/openldap/slapd.pid argsfile /var/run/openldap/slapd.args database bdb suffix "dc=example,dc=com" rootdn "cn=Manager,dc=example,dc=com" rootpw {SHA}hashed_password directory /var/lib/ldap access to * by * read ``` 将 "dc=example,dc=com" 修改为您的组织名称,并设置 "rootpw" 为管理员密码的SHA哈希值。您可以使用以下命令生成SHA哈希值: ``` slappasswd -s 密码 ``` 3. 配置ldap.conf文件: 编辑/etc/openldap/ldap.conf文件并添加以下内容: ``` BASE dc=example,dc=com URI ldap://localhost ``` 将 "dc=example,dc=com" 修改为您的组织名称。 4. 导入示例数据: 在/usr/share/openldap/migration目录下有一个示例数据文件,您可以使用以下命令将示例数据导入LDAP数据库: ``` cp /usr/share/openldap/migration/migrate_common.ph /usr/share/openldap/migration/migrate_common.ph.bak sed -i 's/^\$DEFAULT_MAIL_DOMAIN.*$/\$DEFAULT_MAIL_DOMAIN = "example.com";/g' /usr/share/openldap/migration/migrate_common.ph /usr/share/openldap/migration/migrate_base.pl > /tmp/base.ldif /usr/share/openldap/migration/migrate_passwd.pl /etc/passwd > /tmp/passwd.ldif /usr/share/openldap/migration/migrate_group.pl /etc/group > /tmp/group.ldif ldapadd -x -D "cn=Manager,dc=example,dc=com" -f /tmp/base.ldif -w 管理员密码 ldapadd -x -D "cn=Manager,dc=example,dc=com" -f /tmp/passwd.ldif -w 管理员密码 ldapadd -x -D "cn=Manager,dc=example,dc=com" -f /tmp/group.ldif -w 管理员密码 ``` 将 "example.com" 修改为您的邮件域名,并将 "dc=example,dc=com" 修改为您的组织名称。确保替换 "管理员密码" 为您的管理员密码。 5. 启动slapd服务: ``` systemctl start slapd systemctl enable slapd ``` 现在,您已经在CentOS 7.6上成功部署了LDAP服务。您可以使用ldapsearch命令测试LDAP是否正常工作。例如,使用以下命令查询所有用户信息: ``` ldapsearch -x -b "dc=example,dc=com" "(objectClass=*)" -D "cn=Manager,dc=example,dc=com" -w 管理员密码 ``` 将 "dc=example,dc=com" 修改为您的组织名称,并将 "管理员密码" 修改为您的管理员密码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值