Just like you have JDBC/Hibernate/iBatis templates in Spring, we also have an LDAPTemplate. You can download the spring LDAP library fromĀ http://springframework.org/ldap. The template pattern used here lets us avoid common pitfalls such as not cleaning up resources after using an API (in JDBC its the connection, statement and resultset). Why bother when the template can do this for you! Same holds true for LDAP queries.
For this example I had the following setup:
- Apache Directory Server 1.5.2. I decided to use the sample
directory data. - Installed the Apache Directory Studio eclipse plugin.
To confirm your setup. Open eclipse and go to the LDAP perspective.
Create a new connection with following information:
- hostname – localhost
- port – 10389
- Bind DN or user – uid=admin,ou=system
- password – secret (this is the default password for apache
ds)
This should let you into the directory. Under dc=example,dc=com I added two organizations (asia and americas).
Now for the Spring stuff.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package trial; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ldap.core.LdapTemplate; import org.springframework.stereotype.Service; @Service public class LDAPSampleImpl implements LDAPSample { @Autowired private LdapTemplate ldapTemplate; @Override public List getOrgNames() { return ldapTemplate.list(""); } } |
The spring XML file looks like:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:annotation-config /> <context:component-scan base-package="trial" /> <bean id="ldapContextSource" class="org.springframework.ldap.core.support.LdapContextSource"> <property name="url" value="ldap://localhost:10389" /> <property name="base" value="dc=example,dc=com" /> <property name="userDn" value="uid=admin,ou=system" /> <property name="password" value="secret" /> </bean> <bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate"> <constructor-arg ref="ldapContextSource" /> </bean> </beans> |
Everything above is self explanatory. Now for the test case to execute all of this.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package trial; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:spring-context.xml" }) public class DriverTestCase { @Autowired private LDAPSample ldap; @Test public void testGreeting() { System.out.println(ldap.getOrgNames()); } } |
Running this unit test results in output
1 2 |
>> [ou=asia, ou=americas] |