Spring security Version 3.1 - необходимо сопоставить пользователя, используя либо userPrincipalName без добавления домена, либо sAMAccountName (фильтр поиска?)

Все,

Наш ИТ-отдел решил изменить суффикс наших пользователей в AD, добавив другой суффикс к userPrincipalName в AD для фактического используемого домена.

например наш домен — xxx.com, но userPrincipalName теперь «[email protected]», тогда как раньше это было «[email protected]».

Аутентификация Spring LDAP AD больше не работает с этим по этой причине, я думаю: userPrincipalName создается с использованием имени + домена при попытке аутентификации.

Мне нужно как-то переопределить это, но сохранить версию безопасности Spring 3.1 (в идеале!)

Это компонент безопасности, который мы используем

<bean id="ldapActiveDirectoryAuthProvider" class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">
    <constructor-arg value="$websec{authentication.base}" />
    <constructor-arg value="$websec{ldap.providerUrl}" />
    <property name="authoritiesMapper" ref="dataAutomationGrantedAuthoritiesMapper" />
    <property name="useAuthenticationRequestCredentials" value="true" />
</bean>

Как я могу переопределить это поведение?

Спасибо


person NottmTony    schedule 04.10.2019    source источник
comment
Вы использовали ActiveDirectoryLdapAuthenticationProvider для сопоставления имени пользователя и userPrincipalName с суффиксом xxx.com, но теперь вам нужно пройти аутентификацию с использованием стандартного LdapAuthenticationProvider, чтобы вы могли сопоставить имя пользователя с sAMACcoutnName. См. docs.spring.io/spring-security /site/docs/3.1.x/reference/. Возможно, в качестве временного обходного пути в bean-компоненте ldapActiveDirectoryAuthProvider вы можете попробовать заменить первый аргумент новым жестко заданным доменом <constructor-arg value="zzz.tech" />.   -  person EricLavault    schedule 04.10.2019
comment
Спасибо, но база аутентификации по-прежнему должна оставаться неизменной, потому что это фактический домен. Мне нужен способ остановить автоматическое создание userPrincipalName с использованием доменного имени   -  person NottmTony    schedule 07.10.2019
comment
Хорошо, тогда просто следуйте документу по использованию LdapAuthenticationProvider и обновите сообщение, если вам все еще нужна помощь.   -  person EricLavault    schedule 07.10.2019
comment
Думаю, мне нужно перейти на Spring Security 3.2.6...? Как это имеет метод setSearchFilter?   -  person NottmTony    schedule 08.10.2019
comment
docs.spring.io/autorepo/docs/spring-security/3.2.6.RELEASE/   -  person NottmTony    schedule 08.10.2019
comment
Да, это, кажется, альтернатива, если вы можете обновить. Но не так уж сложно настроить обычного поставщика ldap для работы с аутентификацией AD, вам просто нужно использовать хорошее сопоставление атрибутов (специфичное для AD), но в остальном это просто то же самое, что и аутентификация с использованием другого сервера ldap.   -  person EricLavault    schedule 08.10.2019
comment
Из вашего предыдущего комментария я не понял, что вы хотели использовать ДРУГОГО поставщика LDAP - это было неясно.   -  person NottmTony    schedule 08.10.2019
comment
Нет, я просто имел в виду: используйте стандартный класс LdapAuthenticationProvider и следуйте документации, используя конфигурацию AD.   -  person EricLavault    schedule 08.10.2019


Ответы (1)


В итоге мы изменили исходный код Spring для класса: ActiveDirectoryLdapAuthenticationProvider и изменили метод createBindPrincipal, чтобы разрешить авторизацию userPrincipalName, домен которого отличается от корневого домена безопасности.

/**
 * Create bind principal by appending configured user domain to username if it doesn't already contain a domain.
 *
 * @param username  User name for which to create bind principal.
 *
 * @return username, if configured domain is null or the username already contains a domain; otherwise username
 *         appended with the configured user domain.
 */
String createBindPrincipal(final String username) {
    if (domain == null || username.contains("@")) {
        return username;
    }
    return username + "@" + userDomain;
}
person NottmTony    schedule 17.10.2019
comment
Это избавило нас от необходимости обновлять версии Spring (на данный момент). - person NottmTony; 17.10.2019