|
spring-ldap提供了类似于spring jdbc模板的方法访问ldap。比之jdk中的方法会简单不少。
首先,新建java project,加入spring、spring-ldap及其它相关库。新建包com.yang.ldap.demo。为简单起见,所有类及配置文件都放在此处。新建类UserDaoLdapImpl(其它实现与此无关,进而接口在此处也去掉了)。内容如下:
package com.yang.ldap.demo;
import java.util.List;
import javax.naming.NamingException; import javax.naming.directory.Attributes;
import org.springframework.ldap.AttributesMapper; import org.springframework.ldap.LdapTemplate;
/** * @author yangbagang * */ public class UserDaoLdapImpl {
private LdapTemplate ldapTemplate;
public void setLdapTemplate(LdapTemplate ldapTemplate) { this.ldapTemplate = ldapTemplate; } public List getAllPersonNames() { return ldapTemplate.search( "","(objectclass=person)", new AttributesMapper() { public Object mapFromAttributes(Attributes attrs) throws NamingException { return attrs.get("cn").get(); } }); } public List getAllPersons() { return ldapTemplate.search( "", "(objectclass=person)", new PersonAttributesMapper()); } public Person getPersonByDn(String dn) { return (Person)ldapTemplate.lookup(dn, new PersonAttributesMapper()); } private class PersonAttributesMapper implements AttributesMapper {
public Object mapFromAttributes(Attributes attrs) throws NamingException { Person person = new Person(); person.setCn((String) attrs.get("cn").get()); person.setSn((String) attrs.get("sn").get()); return person; } } }
此处对Person也进行了简化。内容如下:
package com.yang.ldap.demo;
/** * @author yangbagang * */ public class Person {
private String cn; private String sn;
public String getCn() { return cn; }
public void setCn(String cn) { this.cn = cn; }
public String getSn() { return sn; }
public void setSn(String sn) { this.sn = sn; } } 新建spring配置文件applicationContext.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans> <bean id="ldapSource" class="org.springframework.ldap.support.LdapContextSource"> <property name="url" value="ldap://localhost:389" /> <property name="base" value="dc=yang,dc=com" /> <property name="userName" value="cn=root,dc=yang,dc=com" /> <property name="password" value="secret" /> </bean> <bean id="ldapTemplate" class="org.springframework.ldap.LdapTemplate"> <constructor-arg ref="ldapSource" /> </bean> <bean id="userDao" class="com.yang.ldap.demo.UserDaoLdapImpl"> <property name="ldapTemplate"><ref bean="ldapTemplate"/></property> </bean> </beans> 开发所用ldap为openldap for windows,不要尝试用此用户名与密码连接我的ldap啊,呵呵。
没有测试的方法,就等于不存在。下面写测试类TestUserDao。
package com.yang.ldap.demo;
import java.util.List;
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
/** * @author yangbagang * */ public class TestUserDao extends AbstractDependencyInjectionSpringContextTests {
private UserDaoLdapImpl dao; public void setDao(UserDaoLdapImpl dao) { this.dao = dao; }
public void testGetAllPersonNames() { List list = dao.getAllPersonNames(); assertTrue(list.size() > 0); } public void testGetAllPersons() { List list = dao.getAllPersons(); assertTrue(list.size() > 0); } public void testGetPersonByDn() { String dn = "cn=zhangsan,ou=sales,o=users"; String name = "张三"; Person person = dao.getPersonByDn(dn); assertTrue(name.equals(person.getSn())); } /* (non-Javadoc) * @see org.springframework.test.AbstractDependencyInjectionSpringContextTests#getConfigLocations() */ @Override protected String[] getConfigLocations() { return new String[]{"classpath:/com/yang/ldap/demo/applicationContext.xml"}; }
} 运行之后可以看到junit的green bar。 附:如果出错,请先检查一下是否使用了你自己的实际信息替代(如用户名、密码、测试的dn等),另外提高openldap的debug级别也是有效的方法。
|