集成测试带弹簧的安全性和LDAP(Integration tests with spring-sec

2019-07-03 20:23发布

在单元测试中春嵌入式LDAP服务器是类似的,但是没有答案因为我的套房。

我可以用春,没有任何问题弹簧安全的嵌入式LDAP服务器运行我的集成测试。 但是,我还没有找到一种方法尚未明确嵌入式LDAP服务器,并再次加载LDIF提供了一个通用的测试环境。

弹簧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文件来填充它(在启动时为已完成)的方法。 没有任何人有这方面的想法?

版本:3.1春天,春天LDAP 1.3,弹簧安全3.1,Apache的DS 1.5.5

解决方案(感谢卢克·泰勒):

@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
        }
    }
}

Answer 1:

为什么不来看看Spring Security的LDAP集成测试 ,并使用这些作为指导?

目前,这些只是使用LDAP模板 ,以清除每一个测试,如果有必要(速度)创建的数据,但也有一个注释的Junit的@After方法,这确实重装LDIF文件。 该CoreSession通过调用获得getAdminSession()上的服务器实例( DefaultDirectoryService )。

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

getBeanByName(BeanIds.EMBEDDED_APACHE_DS).getService()

获得访问DefaultDirectoryService实例。



文章来源: Integration tests with spring-security and ldap