使用spring嵌入式ldap模拟活动目录进行集成测试

Posted

技术标签:

【中文标题】使用spring嵌入式ldap模拟活动目录进行集成测试【英文标题】:Using spring embedded ldap to simulate active directory for integration tests 【发布时间】:2018-03-20 09:24:39 【问题描述】:

我正在使用 Spring Security ActiveDirectoryLdapAuthenticationProvider 和 Spring Boot(基于注释的配置)来通过 Active Directory 进行身份验证并生成令牌。一切正常。

我希望添加一些模拟整个过程的集成测试,我正在考虑使用 Spring 嵌入式 LDAP 服务器。

我添加了这个从网上找到的另一个示例中获得的 ldif 文件。

#Actual test data

dn: dc=test,dc=com
objectclass: top
objectclass: domain
objectclass: extensibleObject
dc: local

# Organizational Units
dn: ou=groups,dc=test,dc=com
objectclass: top
objectclass: organizationalUnit
ou: groups

dn: ou=people,dc=test,dc=com
objectclass: top
objectclass: organizationalUnit
ou: people

# Create People
dn: uid=testuser,ou=people,dc=test,dc=com
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Test
sn: User
uid: testuser
password: secret

# Create Groups
dn: cn=developers,ou=groups,dc=test,dc=com
objectclass: top
objectclass: groupOfUniqueNames
cn: developers
ou: developer
uniqueMember: uid=testuser,ou=people,dc=test,dc=com

dn: cn=managers,ou=groups,dc=test,dc=com
objectclass: top
objectclass: groupOfUniqueNames
cn: managers
ou: manager
uniqueMember: uid=testuser,ou=people,dc=test,dc=com

但这当然不包括任何 Active Directory 架构的东西。 每个用户都需要有一个sAMAccountName 并且需要有memberOf 属性来确定它所在的组。

有没有什么办法可以使它的行为类似于活动目录,以便 Spring ActiveDirectoryLdapAuthenticationProvider 使用用户的用户名和密码绑定到它并获取其组成员身份以填充其权限?

否则如果这不可行,有没有其他方法可以模拟这个并进行适当的测试?

【问题讨论】:

你最终是如何编写集成测试的 @ravthiru 不幸的是我没有,只是用真实的东西(Active Directory)对其进行了测试。不理想,但我的时间太紧了,不能在这上面浪费时间。 谢谢回复,好像没有什么简单的办法,找了一天。 您是否尝试过使用 TestContainers 代替?因为它会自动创建一个 docker 镜像来运行您的集成测试并绑定到它们的生命周期,所以您可以根据需要对其进行自定义。它支持大多数配置,甚至支持读取 docker-compose 文件。 testcontainers.org/features/creating_container @Sara 不,我没有,但听起来有点太重,无法在单元测试中的每个构建中运行。慢吗? 【参考方案1】:

您可以使用提供 Apache DS 的 spring ldap-testing 依赖项来设置嵌入式 ldap 服务器。见

文章:https://www.baeldung.com/spring-ldap#testing

来源:https://github.com/eugenp/tutorials/blob/master/spring-ldap/src/test/java/com/baeldung/ldap/javaconfig/TestConfig.java

您可以使用的其他内存 LDAP Java 实现包括: https://docs.ldap.com/ldap-sdk/docs/in-memory-directory-server.html

// Create the configuration to use for the server.
InMemoryDirectoryServerConfig config =
     new InMemoryDirectoryServerConfig("dc=example,dc=com");
config.addAdditionalBindCredentials("cn=Directory Manager", "password");

// Create the directory server instance, populate it with data from the
// "test-data.ldif" file, and start listening for client connections.
InMemoryDirectoryServer ds = new InMemoryDirectoryServer(config);
ds.importFromLDIF(true, "test-data.ldif");
ds.startListening();

或者:https://github.com/inbloom/ldap-in-memory

如果您更喜欢类似生产的场景,您也可以在测试容器中使用完整的 ldap 服务器。

【讨论】:

以上是关于使用spring嵌入式ldap模拟活动目录进行集成测试的主要内容,如果未能解决你的问题,请参考以下文章

带有 apacheds 的示例活动目录 ldif 文件

使用 python + ldap 对活动目录进行身份验证

通过 Active Directory LDAP 使用 Spring-Security 进行身份验证

如何使用 Spring Ldap Authentication 和 spring mvc 对用户进行身份验证

Spring Security - CAS 自定义到 LDAP 集成

使用服务帐户对 LDAP 目录进行 Spring-Authentication