Использование Spring Embedded ldap для имитации активного каталога для интеграционных тестов

Я использую Spring Security ActiveDirectoryLdapAuthenticationProvider с Spring Boot (конфигурация на основе аннотаций) для аутентификации в Active Directory и создания токенов. Все работает нормально.

Я хочу добавить некоторые интеграционные тесты, которые имитируют весь процесс, и я думал, возможно, использовать для этого встроенный сервер LDAP Spring.

Я добавил этот файл 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 связывался с ним с помощью имени пользователя и пароля и получал членство в группе для заполнения своих полномочий?

В противном случае, если это нежизнеспособно, есть ли другой способ издеваться над этим и провести надлежащий тест?


person jbx    schedule 09.10.2017    source источник
comment
Как вы пришли к написанию интеграционных тестов   -  person ravthiru    schedule 20.05.2020
comment
@ravthiru К сожалению, я этого не сделал и просто проверил это на реальном (Active Directory). Не идеально, но у меня было слишком мало времени, чтобы продолжать тратить время на хождение по кругу.   -  person jbx    schedule 21.05.2020
comment
Спасибо за ответ, похоже, нет простого способа сделать это. Я потратил день на его поиски.   -  person ravthiru    schedule 21.05.2020
comment
Вы пытались вместо этого использовать TestContainers? Поскольку он автоматически создает образ докера для запуска ваших интеграционных тестов и привязан к их жизненному циклу, вы можете настроить его по своему усмотрению. Он поддерживает большинство конфигураций и даже чтение файлов docker-compose. testcontainers.org/features/creating_container   -  person Sara    schedule 10.06.2020
comment
@ Сара нет, нет, но звучит слишком тяжело, чтобы запускать каждую сборку в модульных тестах. это медленно?   -  person jbx    schedule 10.06.2020
comment
потому что его следует использовать только в одном классе интеграционных тестов на модуль, хотя он немного медленнее, чем встроенный компонент, обычно это не проблема. при первом запуске его в сборке он будет медленнее, потому что для загрузки потребуется образ докера. :) В целом, он становится довольно популярным среди встроенных компонентов, особенно для замены встроенных баз данных, но в этом случае он также весьма полезен.   -  person Sara    schedule 11.06.2020
comment
@jbx создание экземпляра и запуск контейнера Docker займет некоторое время, но вы получите интеграционное тестирование в среде, очень близкой к реальной, которая будет использоваться в производстве (конечно, вам понадобится время, чтобы установить его правильно и так, как вам нужно).   -  person Dmitriy    schedule 16.07.2020


Ответы (1)


Вы можете использовать зависимость весеннего тестирования ldap, которая предоставляет Apache DS для настройки встроенного сервера 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

Другие реализации Java LDAP в памяти, которые вы можете использовать: 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 внутри тестового контейнера, если предпочитаете сценарий, более похожий на производственный.

person Andi    schedule 19.12.2020