0

我使用 spring security 和嵌入式 ApacheDS 服务器为 LDAP 身份验证编写了一些单元测试。服务器通过 spring 应用程序上下文中的元素配置自动启动。我为测试指定了一个 LDIF 文件。一切都很棒。测试在我们的 Jenkins 实例上运行了一周,直到有一天测试无法正常关闭并删除了 apacheds-spring-security 目录。由于此目录的存在,后续测试运行将崩溃。

这个问题之前在

ApacheDS 嵌入 Spring

答案是提供一个指定工作目录位置的命令行参数。如果我能做到这一点,我可以指定我的 maven 构建的目标目录,当它在构建和测试之前进行清理时,maven 会为我解决这个问题。

都好。问题是,如何指定这个工作目录?-DapacheDSWorkDir="foo" 在我运行 Maven 构建时被忽略,并且尝试以编程方式设置此值也不起作用。有人有什么想法吗?如您所见,该配置没有提及任何底层 LDAP 提供程序。

    <ldap-server id="ldapServer" 
        url="ldap://localhost:33389/dc=aws,dc=com" 
        manager-dn="uid=admin,ou=system" 
        manager-password="secret"/>

<ldap-server ldif="classpath:/ldap/test-server.ldif"
    root="dc=aws,dc=com"/>

<bean:bean id="federatedLdapUserContextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
    <bean:constructor-arg value="ldap://localhost:33389/dc=aws,dc=com"/>        
</bean:bean>

任何帮助将非常感激。

4

1 回答 1

0

试试这个(注意半伪代码):

package spring;

import org.springframework.security.ldap.server.ApacheDSContainer;

public final class EmbeddedApacheDsConfigurer implements BeanPostProcessor {

    private String workingDirectory;

    public void setWorkingDirectory(String workingDirectory) {
        this.workingDirectory = workingDirectory;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof ApacheDSContainer) {
             ((ApacheDSContainer)bean).setWorkingDirectory(new File(workingDirectory));
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
         return bean;
    }
}

然后在您的测试 bean 配置中:

<bean class="spring.EmbeddedApacheDsConfigurer" p:workingDirectory="target/apacheds" />

这假设 Maven 的工作目录在运行测试时被设置为项目的根目录。

于 2013-09-19T20:48:31.270 回答