使用spring embedded ldap模拟活动目录以进行集成测试

jbx*_*jbx 10 active-directory spring-security ldif spring-security-ldap spring-boot

我正在使用ActiveDirectoryLdapAuthenticationProvider带有Spring Boot 的Spring Security (基于注释的配置)来使用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
Run Code Online (Sandbox Code Playgroud)

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

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

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

And*_*ndi 3

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

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

来源: https: //github.com/eugenp/tutorials/blob/master/spring-security-modules/spring-security-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();
Run Code Online (Sandbox Code Playgroud)

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

如果您更喜欢更像生产的场景,您还可以在测试容器内使用完整的 LDAP 服务器。