日志文章

2007年07月11日 09:51:08

spring-ldap实例之一

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级别也是有效的方法。

Tags: spring   ldap  

类别: 无分类 |  评论(0) |  浏览(10524) |  收藏