Java操作AD域LDAP操作学习日志

来源:互联网 发布:央视网络客户端手机版 编辑:程序博客网 时间:2024/05/16 12:41

 最近本人在公司接到了Java操作AD域的需求,具体老说是通过AD域里建立的用户可以导入到我的本地库,然后通过本地库创建的用户可以同步到AD域中。

        接到这个需求无从下手,后来了解到通过LDAP目录协议可以操作AD域用户,所以随便在网上找了关于java操作AD域的方法,看了很多人的方法,都是一般的增删该查,该开始以为这些操作已经满足了,后来发现,查询可以实现,删除可以实现,但是如果要添加一个已经开启的用户和修改用户密码这些代码都没有涉及到,后来想了想,这好像是一个技术问题,没有人肯公布出来这种办法,本人也比较愚钝,最后用了半个月的时间才整出来java完整操作AD域的方法。下面介绍一下解决过程。

        首先,我用到了SpringLdap去实现了普通的操作(查询,修改,删除),这些代码网上都可以找到,这个主要是用到了普通端口“"ldap://192.168.10.10:389"”,然后又用到了JNDI方面的东西,用这个方法进行了添加开启状态的用户并设置了永不过期的密码。具体代码我下边会贴出来。下面介绍一下里边的我遇到的盲点。

        第一就是刚开始添加用户老添加不进去,后来发现原因是,AD域用户里边有很多属性,你可以不去设置这些属性,如果要设置的话千万不能给个空值,然后是必须得了解你所操作的AD域的目录,一般都是这种格式“CN=lisi2,CN=Users,DC=vdidomain,DC=user,DC=com”,这个目录如果找不对的话什么也操作不了,然后想要建立开启的用户必须得用“"ldap://192.168.10.10:636"”端口进行操作,操作的前提是你要先在域里搭建一个CA证书的环境,然后把证书从服务器导出来,然后拿到本地通过keytool工具进行编译,这个编译的方法网上一搜一大把,我就不做解释了,编译好后直接引用“String keystore = "E:/JDK/64/JDK-1.7-64/bin/china-ops.keystore" System.setProperty("javax.NET.ssl.trustStore", keystore);System.setProperty("javax.Net.ssl.trustStorePassword", "******"); AD域用户的状态一般有三种,512/0x0200是开启,514/0x0200+0x0002是关闭,66048/0x10000+0x0200是密码永不过期,注意建用户的时候一定要先添加操作再进行修改。

       以上说的这些可能没有接触过的人有点看不懂,既然你要做这一块那就只有先了解一下基本知识再进行操作,要不然中间问题会有很多。想必拿到我这个代码之后也许两个小时之内你的问题就解决了,下面贴一下关键代码:

1,389端口操作

public class Test {
    public static void main(String[] args) throws Exception {
        BeanFactory cxt = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        PersonDao personDao = (PersonDao) cxt.getBean("personDao");
        Person person = new Person();
        person.setCn("lisi2");
        person.setSn("lisi2");
        person.setDisplayName("lisi");
        person.setUserPassword("1234@qwer");
        person.setsAMAccountName("lisi2");
        person.setUserPrincipalName("lisi2");
        //person.setUserAccountControl(Integer.toString(DONT_EXPIRE_PASSWORD + NORMAL_ACCOUNT));
        personDao.createOnePerson(person);
        
        //person.setCn("lisi5");
        //person.setSn("lisi5");
        //person.setUserPassword("123.com");
        /*List<Person> list = personDao.getPersons();
        System.out.println(list.size());
        for(int i=0;i<list.size();i++){
            Person person2 = list.get(i);
            System.out.println("cn = "+person2.getCn()+"---------"+"displayName = "+person2.getDisplayName());
        }*/
        
        
        //删除
        //personDao.removeOnePerson("lisi");
        
        //修改
        /*person.setCn("lisi3");
        person.setSn("lisi3333");
        person.setDisplayName("lisi333");
        person.setUserPassword("123.com");
        personDao.updateOnePerson(person);*/
        
    }
}

2,389端口实现

public class PersonDao {  
  
    //注入spring的LdapTemplate,此处在spring的配置文件中需要配置  
    private LdapTemplate ldapTemplate;  
  
    public LdapTemplate getLdapTemplate() {  
        return ldapTemplate;  
    }  
    public void setLdapTemplate(LdapTemplate ldapTemplate) {  
        this.ldapTemplate = ldapTemplate;  
    }  
      

     
    /** 
     * 根据dn查询详细信息 
     * @param cn 
     * @return 
     *//*  
    public UcenterLdapApplication getPersonDetail(String cn) {  
        try {  
            //ldapTeplate的lookup方法是根据dn进行查询,此查询的效率超高  
            UcenterLdapApplication ua = (UcenterLdapApplication)   
                ldapTemplate.lookup(getDn(cn),  
                        new ApplicationAttributeMapper());  
            return ua;  
        } catch (NameNotFoundException e) {  
            return null;  
        }  
    }  */
  
    /** 
     * 查询person列表 
     * @param person 
     * @return 
     */  
    @SuppressWarnings("unchecked")
    public List<Person> getPersons() {
        String filter = "(&(objectclass=user))";
        Person person = new Person();
        List<Person> list = ldapTemplate.search("", filter, new AttributesMapper() {
            public Object mapFromAttributes(Attributes attributes) throws NamingException {
                Person person = new Person();

                if (attributes.get("cn") != null){
                    person.setCn((String)attributes.get("cn").get());
                }
                if (attributes.get("sn") != null){
                    person.setSn((String)attributes.get("sn").get());
                }
                if (attributes.get("displayName") != null){
                    person.setDisplayName((String)attributes.get("displayName").get());
                }
                if (attributes.get("userPassword") != null) {  
                    //person.setUserPassword((String) attributes.get("userPassword").get());
                    System.out.println("------security_credentials---------"+Context.SECURITY_CREDENTIALS);
                }
                return person;
            }
        });
        list.add(person);
        /*if (list.isEmpty()){
            return null;
        }*/
        return list;
    }
    
    /*private String exchange(String input)
    {
        int number = (input.length() + 1) / 3;
        String strReturn = "";
        String[] strArray = input.split(" ");
        byte[] byteArray = new byte[2];
        byte[] retByte = new byte[strArray.length];
        int intTemp;
        String c;
        for (int i = 0; i < strArray.length; i++)
        { 
            intTemp = Convert.ToInt32(strArray[i], 16);
            if (intTemp > 122)
            {
                byteArray = new byte[2] { (byte)intTemp, (byte)Convert.ToInt32(strArray[i+1], 16) };
                c = System.Text.Encoding.Default.GetString(byteArray);
                i++;
            }
            else
                c = Convert.ToChar(intTemp).ToString();
            strReturn = strReturn + c;
        }
        return strReturn;
    }*/
    
    /** 
     * 删除一条记录,根据dn 
     * @param cn 
     */  
    public void removeOnePerson(String cn) {  
        ldapTemplate.unbind(getDn(cn));  
    }  
    
    public boolean deleteUser(String username) {
        try {
            ldapTemplate.unbind("uid=" + username.trim());
            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
            return false;
        }
    }
  
    /** 
     * 修改操作 
     * @param person 
     */  
    public void updateOnePerson(Person person) {  
        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("sn",person.getSn())));  
        mList.add(new ModificationItem(DirContext.REPLACE_ATTRIBUTE,  
                new BasicAttribute("description",person.getDescription())));  
        mList.add(new ModificationItem(DirContext.REPLACE_ATTRIBUTE,  
                new BasicAttribute("seeAlso",person.getSeeAlso())));  
        mList.add(new ModificationItem(DirContext.REPLACE_ATTRIBUTE,  
                new BasicAttribute("telephoneNumber",person.getTelephoneNumber())));*/
        mList.add(new ModificationItem(DirContext.REPLACE_ATTRIBUTE,  
                new BasicAttribute("sn",person.getSn()))); 
        mList.add(new ModificationItem(DirContext.REPLACE_ATTRIBUTE,  
                new BasicAttribute("displayName",person.getDisplayName())));  
        mList.add(new ModificationItem(DirContext.REPLACE_ATTRIBUTE,  
                new BasicAttribute("userPassword",person.getUserPassword())));  
          
        if (mList.size() > 0) {  
            ModificationItem[] mArray = new ModificationItem[mList.size()];  
            for (int i = 0; i < mList.size(); i++) {  
                mArray[i] = mList.get(i);  
            }  
            //modifyAttributes 方法是修改对象的操作,与rebind()方法需要区别开  
            System.out.println(person.getCn());
            ldapTemplate.modifyAttributes(this.getDn(person.getCn()), mArray);
            System.out.println(person.getCn());
        }  
    }  

}  



由于公司最近有需求要操作ad域同步账号,以上代码是我在上网搜了自己又整理的,自己也测了可行,如果有不懂得可以联系我问我。

0 0