【ldap】ldap系列-java对ldap的增删改查-翻页、重命名、密码修改

2 篇文章 1 订阅

公司有几千号员工,使用ldap管理人员账号,开发了一套ad域的管理系统,方便人员入离职账号的统一管理、运维账号统一管理、单点登录管理、现将经生产环境运行稳定的代码放出,供大家参考,网上资料太少了,很多代码都用不了,基本一步一坑,

一些高级功能,可以加qq群:669293878 讨论:例如ad域密码(unicodePwd)修改、查询翻页,对ad域的jdk免证书登录等

person类:

package com.ad.ldaps;

import lombok.Data;

@Data
public class Person {

	
	private String cn;
	private String userPassword;
	
	private String sAMAccountName;
	private String name;
	private String sn;
	private String userAccountControl;
	private String telephoneNumber;
	private String givenName;
	private String description;
	private String displayName;
	private String mail;
	private String gidnumber;
	private String loginshell;
	private String uidnumber;
	private String homeDirectory;
	private String userWorkstations;
	
}

ldap增删改查:

package com.ad.ldaps;

import javax.naming.Context;
import javax.naming.NameClassPair;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.*;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;

/**
 * @Description:对Ldap用户的增删改查操作
 * @author codearch qq:263664112
 * @date 2020-07-03
 */
public class LdapUserBlog {
    //DirContext dc = null;
	LdapContext dc = null;
    String root = "ou=people,dc=maxcrc,dc=com"; // LDAP的根节点的DC
    
    //生产环境
    final static String LDAPURL = "ldap://localhost:389";
    final static String USER_NAME = "cn=Manager,dc=maxcrc,dc=com";
    final static String USER_PWD = "secret";
    
    /**
     * @Description:程序入口
     * @author codearch
     * @throws Exception 
     * @date 2019-07-03
     */
    public static void main(String[] args) throws Exception {

        LdapUserBlog utils = new LdapUserBlog();
    	//utils.certinit();
    	String userName = "myhtest";
    	
    	//0.连接
    	utils.init();

        //1.添加用户
        utils.add(userName);
        //utils.add("lisi","si","li");
    	
    	//6.删除用户
        //utils.delete(userName);

        //2.查找组织单位下的所有用户
        //String base = utils.root;
        //base = "ou=IT,dc=maxcrc,dc=com";
        //utils.searchInformation(base);

/*        //3.查找组织单位下的某个用户
        SearchResult sr = utils.searchByUserName(utils.root, "lisi");
        System.out.println(sr.getName());*/

    	//7.修改密码失败
//    	String oldPwd = "GoodSense@";
//    	String newPwd = "123456@sensetime";
        //utils.updatePWD(userName,oldPwd,newPwd);
    	

    	


        //4.修改用户属性
        //utils.updatePerson(userName);
    	   	
    	//5.重命名用户
        //utils.renameEntry("cn=myh,ou=people,dc=maxcrc,dc=com", "cn=myhrename,ou=people,dc=maxcrc,dc=com");

    	//utils.searchByUserNameUidNumber(utils.root,"lisi");
    	
    	
    	//3.查找组织单位下的某个用户
        //SearchResult sr = utils.searchByUserName(utils.root, "lisi");
        //System.out.println(sr.getName());

        //utils.enablePerson("lisi");
        //utils.searchInformation(utils.root);
        
        //获取最大uidnumber
        //int uidnumber = utils.getMaxUid();
        //System.out.println("最大uidnumber:"+uidnumber);
        
        utils.close();
    }
    
    

    /**
     * @Description:使用非安全方式登录
     * @author codearch qq群:669293878
     * @date 2018-07-03
     */
    public void init() {
        Properties env = new Properties();
        String adminName = "cn=Manager,dc=maxcrc,dc=com";// username@domain
		String adminPassword = "secret";// password
		String ldapURL = "ldap://localhost:389";// ip:port
        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");//LDAP访问安全级别:"none","simple","strong"
        env.put(Context.SECURITY_PRINCIPAL, adminName);
        env.put(Context.SECURITY_CREDENTIALS, adminPassword);
        env.put(Context.PROVIDER_URL, ldapURL);
        try {
            dc = new InitialLdapContext(env, null);
            System.out.println("Ldap帐户密码认证成功");
        } catch (Exception e) {
            System.out.println("Ldap帐户密码认证失败");
            e.printStackTrace();
        }
    }
    
    
    
    /**
     * @Description:关闭Ldap服务连接
     * @author codearch qq群:669293878
     * @date 2018-07-03
     */
    public void close() {
        if (dc != null) {
            try {
                dc.close();
                System.out.println("Ldap服务连接关闭");
            } catch (NamingException e) {
                System.out.println("NamingException in close():" + e);
            }
        }
    }
    
    /**
     * @Description:新增Ldap用户
     * @author codearch qq群:669293878
     * @date 2018-07-03
     */
    public void add(String newUserName) {
        try {
        	
        	String newQuotedPassword = "\"GoodSense@\"";
        	byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16LE");
        	//"unicodePwd: "+newUnicodePassword,

            BasicAttribute objclassSet = new BasicAttribute("objectclass");
            objclassSet.add("top");
            objclassSet.add("inetOrgPerson");
            objclassSet.add("posixAccount");
        	
            Attributes attrs = new BasicAttributes(true);
            attrs.put(objclassSet);//将objectclass加到属性集合中
            attrs.put("uid",newUserName);
            attrs.put("uidNumber",System.currentTimeMillis()+"");
            attrs.put("gidNumber","0");
            attrs.put("homeDirectory","/root");


	        attrs.put("telephoneNumber","15880888368");
	        attrs.put("displayName", "显示名称");
	        attrs.put("description","描述");
	        attrs.put("mail",newUserName + "@sensetime.com");
	        attrs.put("givenName","名字");
	        //attrs.put("name","newUserName");
	        attrs.put("cn", newUserName);
	        attrs.put("sn", newUserName);

            
            dc.createSubcontext("cn=" + newUserName + "," + root, attrs);
            System.out.println("新增Ldap用户成功:" + newUserName);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("新增Ldap用户失败:" + newUserName);
        }
    }


    /**
     * @Description:新增Ldap用户
     * @author codearch qq群:669293878
     * @date 2018-07-03
     */
    public void add (String newUserName,String firstName,String lastName) {
        try {

            BasicAttribute objclassSet = new BasicAttribute("objectclass");
            objclassSet.add("top");
            objclassSet.add("inetOrgPerson");
            objclassSet.add("posixAccount");

            Attributes attrs = new BasicAttributes(true);
            attrs.put(objclassSet);//将objectclass加到属性集合中
            attrs.put("uid",newUserName);
            attrs.put("uidNumber",System.currentTimeMillis()+"");
            //attrs.put("uidnumber", getMaxUid());
            attrs.put("gidNumber","0");
            attrs.put("homeDirectory","/root");
            attrs.put("telephoneNumber","15880888368");
            attrs.put("displayName", lastName + " "+firstName);
            attrs.put("description","描述");
            attrs.put("mail",newUserName + "@qq.com");
            attrs.put("givenName",firstName);
            attrs.put("sn", lastName);
            attrs.put("cn", newUserName);



            dc.createSubcontext("cn=" + newUserName + "," + root, attrs);
            System.out.println("新增Ldap用户成功:" + newUserName);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("新增Ldap用户失败:" + newUserName);
        }
    }


    /**
     * @Description:删除Ldap用户
     * @author codearch qq群:669293878
     * @date 2018-07-03
     */
    public void delete(String userName) {
    	String dn = "cn="+userName+","+ root;
        try {
        	
            dc.destroySubcontext("cn="+userName+","+ root);
            System.out.println("删除Ldap用户成功:" + dn);
        } catch (Exception e) {
            System.out.println("删除Ldap用户失败:" + dn);
            e.printStackTrace();
        }
    }

    /**
     * @Description:重命名Ldap用户
     * @author codearch qq群:669293878
     * @date 2018-07-03
     */
    public boolean renameEntry(String oldDN, String newDN) {
        return true;
    }    
    
    /**
     * @Description:修改Ldap用户属性
     * @author codearch qq群:669293878
     * @date 2018-07-03
     */
    public void updatePerson(String dn) {
    	
    	Person person = new Person();		
		person.setCn(dn);
        person.setDescription("修改描述");
    	
        if (person == null || person.getCn() == null 
                || person.getCn().length() <= 0) {
            return;
        }
        
        //修改的属性
        List<ModificationItem> mList = new ArrayList<ModificationItem>();
        mList.add(new ModificationItem(DirContext.REPLACE_ATTRIBUTE,new BasicAttribute("description", person.getDescription())));

        if (mList.size() > 0) {
        	
        	//集合转为数组
            ModificationItem[] mArray = new ModificationItem[mList.size()];
            for (int i = 0; i < mList.size(); i++) {
                mArray[i] = mList.get(i);
            }
            try {
				dc.modifyAttributes("cn="+dn + "," + root, mArray);
				System.out.println("修改Ldap用户属性成功");
			} catch (NamingException e) {
				System.err.println("修改Ldap用户属性失败");
				e.printStackTrace();
			}
        }
        
        
    }

    

    
    /**
     * @Description:修改Ldap用户属性
     * @author codearch qq群:669293878
     * @date 2018-07-03
     */
    public void enablePerson(String dn) {

    }

    /**
     * @Description:搜索指定节点下的所有Ldap用户
     * @author codearch qq群:669293878
     * @date 2018-07-03
     */
    public void searchInformation(String searchBase) {
    	//要获取的对象属性

    	String[] attributeNames = { "memberOf", "uidNumber","cn","objectClass"};
        
    	try {
            SearchControls searchCtls = new SearchControls();
            searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
            String searchFilter = "objectClass=inetOrgPerson";
            String returnedAtts[] = { "memberOf" };
            searchCtls.setReturningAttributes(returnedAtts);
            
            NamingEnumeration<?> answer = dc.search(searchBase, searchFilter, searchCtls);
            while (answer.hasMoreElements()) {

                NameClassPair ncp = (NameClassPair) answer.next();
                String ncpName = ncp.getName();
                Attributes atts = dc.getAttributes(ncpName + "," + searchBase, attributeNames);
                //获取对象属性
                Attribute uidnumber = atts.get("uidNumber");
                if(uidnumber!=null) {
                	String value = (String) uidnumber.get();
                	System.out.println(ncpName+"|"+value+"|uidNumber:"+uidnumber.toString());
                }

                System.out.println("--------------------");
                Attribute objectClassAuttribute = atts.get("objectClass");
                if(objectClassAuttribute != null) {
                	
   				 	if (objectClassAuttribute.toString().indexOf("inetOrgPerson") != -1) {
   					 //获取用户是user
   					 System.out.println(atts+ncpName + "," + searchBase);
   				 	}
                }


                           
            
                
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @Description:指定搜索节点搜索指定域用户
     * @author codearch qq群:669293878
     * @date 2018-07-03
     */
    public SearchResult searchByUserName(String searchBase, String userName) {
        SearchControls searchCtls = new SearchControls();
        searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
        String searchFilter = "uid=" + userName;
        String returnedAtts[] = { "memberOf" }; //定制返回属性
        searchCtls.setReturningAttributes(returnedAtts); //设置返回属性集
        try {
            NamingEnumeration<SearchResult> answer = dc.search(searchBase, searchFilter, searchCtls);
            
            return answer.next();
        } catch (Exception e) {
            System.err.println("指定搜索节点搜索指定域用户失败");
            e.printStackTrace();
        }
        return null;
    }
    
    
    /**
     * @Description:指定搜索节点搜索指定域用户
     * @author codearch qq群:669293878
     * @throws Exception 
     * @date 2018-07-03
     */
    public void searchByUserNameUidNumber(String searchBase, String userName) throws Exception {
        SearchControls searchCtls = new SearchControls();
        searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
        String searchFilter = "cn=" + userName;
        String returnedAtts[] = { "memberOf" }; //定制返回属性
        searchCtls.setReturningAttributes(returnedAtts); //设置返回属性集
        String[] attributeNames = { "memberOf", "uidNumber","name","objectClass"};
        

        
        NamingEnumeration<?> answer = dc.search(searchBase, searchFilter, searchCtls);
        while (answer.hasMoreElements()) {
            NameClassPair ncp = (NameClassPair) answer.next();
            String ncpName = ncp.getName();
            Attributes atts = dc.getAttributes(ncpName + "," + searchBase, attributeNames);
            //获取对象属性
            Attribute uidnumber = atts.get("uidNumber");

            
            if(uidnumber!=null) {
            	String value = (String) uidnumber.get();

            	System.out.println(ncpName+" uidNumber:"+value);
            }
            


                       
        
            
        }
        
    }

    
}

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ErekSZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值