使用spring-security和ldap进行集成测试

时间:2012-11-15 11:35:11

标签: spring-security integration-testing spring-ldap

Spring embedded ldap server in unit tests是类似的,但没有给出任何答案,包括我。

我可以使用spring和spring-security的嵌入式ldap服务器运行我的集成测试,没有任何问题。 但是,我还没有找到一种方法来清除嵌入式ldap服务器并再次加载ldif以提供一个通用的测试环境。

spring-ldap的LdapTestUtils提供了一个cleanAndSetup()方法。但是,这不适用于apache-ds的建议版本(1.5.5),因为LdifFileLoader现在需要 CoreSession 而不是LdapTestUtils提供的 DirContext 。这会导致

java.lang.NoSuchMethodError:
org.apache.directory.server.protocol.shared.store.LdifFileLoader.<init>(Ljavax/naming/directory/DirContext;Ljava/lang/String;)

我只想要一个清除嵌入式ldap服务器并再次使用ldif文件填充它的方法(在启动时完成)。 有没有人对此有所了解?

版本:spring 3.1,spring-ldap 1.3,spring-security 3.1,apache-ds 1.5.5

解决方案(感谢Luke Taylor):

@Inject
private ApplicationContext applicationContext;

@Before
public void reloadLdapDirectory() throws NamingException, IOException{
    ApacheDSContainer apacheDSContainer = (ApacheDSContainer) applicationContext.getBean(BeanIds.EMBEDDED_APACHE_DS);
    LdapTestUtils.clearSubContexts(contextSource, DistinguishedName.EMPTY_PATH);

    ClassPathResource classPathResource = new ClassPathResource("ldap.ldif");

    File tempFile = File.createTempFile("spring_ldap_test", ".ldif");
    try {
        InputStream inputStream = classPathResource.getInputStream();
        IOUtils.copy(inputStream, new FileOutputStream(tempFile));
        LdifFileLoader fileLoader = new LdifFileLoader(apacheDSContainer.getService().getAdminSession(), tempFile.getAbsolutePath());
        fileLoader.execute();
    }
    finally {
        try {
            tempFile.delete();
        }
        catch (Exception e) {
            // Ignore this
        }
    }
}

1 个答案:

答案 0 :(得分:4)

为什么不看一下Spring Security的LDAP integration tests并将其作为指南?

目前,这些只是use an LDAP template来清除每个测试在必要时创建的数据(速度),但是还有一个注释掉的Junit @After method,它会重新加载LDIF文件。 CoreSession是通过调用服务器实例上的getAdminSession()获得的(DefaultDirectoryService)。

如果您真的必须使用XML应用程序上下文运行测试,使用<ldap-server />元素,您可以使用:

getBeanByName(BeanIds.EMBEDDED_APACHE_DS).getService()

访问DefaultDirectoryService实例。