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; } }
1 package ldap.mapper; 2 3 import javax.naming.NamingException; 4 import javax.naming.directory.Attributes; 5 6 import ldap.entity.Person; 7 8 import org.springframework.ldap.core.AttributesMapper; 9 10 /** 11 * 这个类的作用是将ldap中的属性转化为实体类的属性值, 12 * 在查询信息的时候会用到 13 */ 14 public class PersonAttributeMapper implements AttributesMapper{ 15 16 @Override 17 public Object mapFromAttributes(Attributes attr) throws NamingException { 18 Person person = new Person(); 19 person.setSn((String)attr.get("sn").get()); 20 person.setCn((String)attr.get("cn").get()); 21 22 if (attr.get("userPassword") != null) { 23 person.setUserPassword((String)attr.get("userPassword").get()); 24 } 25 if (attr.get("telephoneNumber") != null) { 26 person.setTelephoneNumber((String)attr.get("telephoneNumber").get()); 27 } 28 if (attr.get("seeAlso") != null) { 29 person.setSeeAlso((String)attr.get("seeAlso").get()); 30 } 31 if (attr.get("description") != null) { 32 person.setDescription((String)attr.get("description").get()); 33 } 34 return person; 35 } 36 37 }
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; } }