Spring-аутентификация с использованием ActiveDirectoryLdapAuthenticationProvider и встроенного ldif - PullRequest
0 голосов
/ 18 февраля 2020

одним из требований моих клиентов была аутентификация пользователей по его корпоративному ActiveDirectory (LDAP). Поэтому я использовал стандартный ActiveDirectoryLdapAuthenticationProvider, и он работает как шарм.

@Bean
public ActiveDirectoryLdapAuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
    ActiveDirectoryLdapAuthenticationProvider adProvider = new ActiveDirectoryLdapAuthenticationProvider(
            ldapConfig.getLdapDomain(), ldapConfig.getLdapUrl(), ldapConfig.getLdapRoot());
    adProvider.setConvertSubErrorCodesToExceptions(true);
    adProvider.setUseAuthenticationRequestCredentials(true);
    adProvider.setSearchFilter(ldapConfig.getLdapSearchFilter());
    return adProvider;
}

Проблема в том, что клиенты A C скрыты за брандмауэром. Он работает после развертывания, но я не могу достичь A C во время локальной разработки из-за политики безопасности cleints. Итак, у меня возникла идея, что, возможно, для профиля dev я буду использовать встроенный сервер LDAP (UnboundID LDAP SDK для Java). Я не эксперт LDAP, но я как-то составил простой файл ldif, и он выглядит так:

dn: dc=test,dc=local
objectclass: top
objectclass: domain
objectclass: extensibleObject
dc: test
# Organizational Units
dn: ou=groups,dc=test,dc=local
objectclass: top
objectclass: organizationalUnit
ou: groups
dn: ou=people,dc=test,dc=local
objectclass: top
objectclass: organizationalUnit
ou: people
# Users
dn: uid=john,ou=people,dc=test,dc=local
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: John Doe
sn: John
uid: john
password: johnspassword
# Create Groups
dn: cn=administrators,ou=groups,dc=test,dc=local
objectclass: top
objectclass: groupOfUniqueNames
cn: administrators
ou: administrator
uniqueMember: uid=john,ou=people,dc=test,dc=local

Я также настроил свойства встроенного ldap:

spring.ldap.embedded.base-dn=dc=test,dc=local
spring.ldap.embedded.ldif=classpath:localldapactivedirectory.ldif
spring.ldap.embedded.port=12345
spring.ldap.embedded.url=ldap://localhost:12345/
spring.ldap.embedded.validation.enabled=false

UnboundID не имел проблема с этим, но, как вы думаете, я сталкиваюсь с проблемой во время аутентификации:

[LDAP: error code 34 - Unable to parse bind DN 'john@test.local':  Unable to parse string 'john@test.local' as a DN because it does not have an equal sign after RDN attribute 'john@test.local'.]; nested exception is javax.naming.InvalidNameException: [LDAP: error code 34 - Unable to parse bind DN 'john@test.local':  Unable to parse string 'user_cms@test.com' as a DN because it does not have an equal sign after RDN attribute 'john@test.local'.]

Чтобы показать вам всю картинку, я добавляю, что ошибка происходит при попытке аутентификации (в пользовательской службе аутентификации):

Authentication authentication = authenticationManagerBuilder.getObject()
            .authenticate(authenticationToken);

Я предполагаю, что это вызвано тем, что мой файл ldif слишком прост. Он будет работать с обычным поставщиком аутентификации Ldap, но не с ActiveDirectoryLdapAuthenticationProvider.

Есть ли кто-нибудь, кто знает, как «смоделировать» ActiveDirectory (LDAP) в файле ldif, чтобы ActiveDirectoryLdapAuthenticationProvider мог использовать его во время аутентификации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...