您的位置:首页 > 编程语言 > Java开发

Spring-ldap 操作LDAP

2016-07-19 19:03 495 查看
在看这个文章之前,最好是了解了openldap的schema文件,也就是了解objectClass和attribute以及它们的关系。否则很容易不了解代码的含义以及抛出的异常。

实体类:

[java] view
plaincopy





package ldap.entity;  

  

/** 

 * 本测试类person对象来自schema文件的core.schema文件 

 * objectClass为person,必填属性和可选属性也是根据该对象得到的。 

 * Author:Ding Chengyun 

 */  

public class Person {  

  

    private String sn; //必填属性  

    private String cn; //必填属性  

      

    private String userPassword; //可选属性  

    private String telephoneNumber; //可选属性  

    private String seeAlso; //可选属性  

    private String description;  //可选属性  

    public String getSn() {  

        return sn;  

    }  

    public void setSn(String sn) {  

        this.sn = sn;  

    }  

    public String getCn() {  

        return cn;  

    }  

    public void setCn(String cn) {  

        this.cn = cn;  

    }  

    public String getUserPassword() {  

        return userPassword;  

    }  

    public void setUserPassword(String userPassword) {  

        this.userPassword = userPassword;  

    }  

    public String getTelephoneNumber() {  

        return telephoneNumber;  

    }  

    public void setTelephoneNumber(String telephoneNumber) {  

        this.telephoneNumber = telephoneNumber;  

    }  

    public String getSeeAlso() {  

        return seeAlso;  

    }  

    public void setSeeAlso(String seeAlso) {  

        this.seeAlso = seeAlso;  

    }  

    public String getDescription() {  

        return description;  

    }  

    public void setDescription(String description) {  

        this.description = description;  

    }  

      

}  

mapper类:

[java] view
plaincopy





package ldap.mapper;  

  

import javax.naming.NamingException;  

import javax.naming.directory.Attributes;  

  

import ldap.entity.Person;  

  

import org.springframework.ldap.core.AttributesMapper;  

  

/** 

 * 这个类的作用是将ldap中的属性转化为实体类的属性值, 

 * 在查询信息的时候会用到 

 */  

public class PersonAttributeMapper implements AttributesMapper{  

  

    @Override  

    public Object mapFromAttributes(Attributes attr) throws NamingException {  

        Person person = new Person();  

        person.setSn((String)attr.get("sn").get());  

        person.setCn((String)attr.get("cn").get());  

          

        if (attr.get("userPassword") != null) {  

            person.setUserPassword((String)attr.get("userPassword").get());  

        }  

        if (attr.get("telephoneNumber") != null) {  

            person.setTelephoneNumber((String)attr.get("telephoneNumber").get());  

        }  

        if (attr.get("seeAlso") != null) {  

            person.setSeeAlso((String)attr.get("seeAlso").get());  

        }  

        if (attr.get("description") != null) {  

            person.setDescription((String)attr.get("description").get());  

        }  

        return person;  

    }  

  

}  

dao类:

[java] view
plaincopy





package ldap.dao;  

  

import java.util.ArrayList;  

import java.util.List;  

  

import javax.naming.directory.Attributes;  

import javax.naming.directory.BasicAttribute;  

import javax.naming.directory.BasicAttributes;  

import javax.naming.directory.DirContext;  

import javax.naming.directory.ModificationItem;  

  

import ldap.entity.Person;  

import ldap.mapper.PersonAttributeMapper;  

  

import org.springframework.ldap.NameNotFoundException;  

import org.springframework.ldap.core.DistinguishedName;  

import org.springframework.ldap.core.LdapTemplate;  

import org.springframework.ldap.filter.AndFilter;  

import org.springframework.ldap.filter.EqualsFilter;  

  

import xhrd.ucenter.ldap.entity.UcenterLdapApplication;  

import xhrd.ucenter.ldap.ldapAttributeMappper.ApplicationAttributeMapper;  

  

/** 

 * Description: 此类的作用是使用spring的 LdapTemplate完成对ldap的增删改查的操作 

 * Author:Ding Chengyun 

 */  

public class PersonDao {  

  

    //注入spring的LdapTemplate,此处在spring的配置文件中需要配置  

    private LdapTemplate ldapTemplate;  

  

    public LdapTemplate getLdapTemplate() {  

        return ldapTemplate;  

    }  

    public void setLdapTemplate(LdapTemplate ldapTemplate) {  

        this.ldapTemplate = ldapTemplate;  

    }  

      

    /** 

     * 添加 一条记录 

     * @param person 

     */  

    public void createOnePerson(Person person) {  

        BasicAttribute ba = new BasicAttribute("objectclass");  

        ba.add("person"); //此处的person对应的是core.schema文件中的objectClass:person  

        Attributes attr = new BasicAttributes();  

        attr.put(ba);  

        //必填属性,不能为null也不能为空字符串  

        attr.put("cn", person.getCn());  

        attr.put("sn", person.getSn());  

  

        //可选字段需要判断是否为空,如果为空则不能添加  

        if (person.getDescription() != null  

                && person.getDescription().length() > 0) {  

            attr.put("description", person.getDescription());  

        }  

  

        if (person.getUserPassword() != null  

                && person.getUserPassword().length() > 0) {  

            attr.put("userPassword", person.getUserPassword());  

        }  

        if (person.getSeeAlso() != null  

                && person.getSeeAlso().length() > 0) {  

            attr.put("seeAlso", person.getSeeAlso());  

        }  

        if (person.getTelephoneNumber() != null   

                && person.getTelephoneNumber().length() > 0) {  

            attr.put("telephoneNumber", person.getTelephoneNumber());  

        }  

          

        //bind方法即是添加一条记录。  

        ldapTemplate.bind(getDn(person.getCn()), null, attr);  

    }  

  

    /** 

     

    /** 

     * 根据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 

     */  

    public List<Person> getPersonList(  

            Person person) {  

        List<Person> list = new ArrayList<Person>();  

        //查询过滤条件  

        AndFilter andFilter = new AndFilter();  

        andFilter.and(new EqualsFilter("objectclass", "person"));  

          

          

        if (person.getCn() != null  

                && person.getCn().length() > 0) {  

            andFilter.and(new EqualsFilter("cn", person.getCn()));  

        }  

        if (person.getSn() != null  

                && person.getSn().length() > 0) {  

            andFilter.and(new EqualsFilter("sn", person.getSn()));  

        }  

  

        if (person.getDescription() != null  

                && person.getDescription().length() > 0) {  

            andFilter.and(new EqualsFilter("description", person.getDescription()));  

        }  

  

        if (person.getUserPassword() != null  

                && person.getUserPassword().length() > 0) {  

            andFilter.and(new EqualsFilter("userPassword", person.getUserPassword()));  

        }  

        if (person.getSeeAlso() != null  

                && person.getSeeAlso().length() > 0) {  

            andFilter.and(new EqualsFilter("seeAlso", person.getSeeAlso()));  

        }  

        if (person.getTelephoneNumber() != null   

                && person.getTelephoneNumber().length() > 0) {  

            andFilter.and(new EqualsFilter("telephoneNumber", person.getTelephoneNumber()));  

        }  

        //search是根据过滤条件进行查询,第一个参数是父节点的dn,可以为空,不为空时查询效率更高  

        list = ldapTemplate.search("", andFilter.encode(),  

                new PersonAttributeMapper());  

        return list;  

    }  

  

    /** 

     * 删除一条记录,根据dn 

     * @param cn 

     */  

    public void removeOnePerson(String cn) {  

        ldapTemplate.unbind(getDn(cn));  

    }  

  

    /** 

     * 修改操作 

     * @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("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()方法需要区别开  

            ldapTemplate.modifyAttributes(this.getDn(person.getCn()), mArray);  

        }  

    }  

    /** 

     * 得到dn 

     * @param cn 

     * @return 

     */  

    private DistinguishedName getDn(String cn) {  

        //得到根目录,也就是配置文件中配置的ldap的根目录  

        DistinguishedName newContactDN = new DistinguishedName();  

        // 添加cn,即使得该条记录的dn为"cn=cn,根目录",例如"cn=abc,dc=testdc,dc=com"  

        newContactDN.add("cn", cn);  

        return newContactDN;  

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LDAP schema