Jmix 2.8.2. Ошибка авторизации через LDAP

Добрый день.

При попытке авторизации через LDAP в новой версии JMIX(2.8.2) ловлю такой баг:

IllegalArgumentException: The name of the password encoder is improperly formatted or incomplete. The format should be ‘{ENCODER}password’.

Пароли пользователей LDAP в базе не хранятся.

Добрый день.

Довольно странно, в LDAP ничего не менялось (кроме небольшого улучшения синхронизации ролей).

Есть разница в зависимостях между 2.8.1 и 2.8.2 - обновление Spring Boot 3.5.13 → 3.5.14.
Которое в свою очередь тянет обновленные зависимости:

  • org.springframework.ldap:spring-ldap-core:3.3.6 → 3.3.7
  • org.springframework.security:spring-security-ldap:6.5.9 → 6.5.10

Но это patch-версии и не должны были как-либо повлиять.

Какая была версия Jmix до обновления?

С уважением,
Иван

2.8.1

В качестве эксперимента попробуйте профорсировать LDAP-зависимости от предыдущей версии:

  • org.springframework.ldap:spring-ldap-core:3.3.6
  • org.springframework.security:spring-security-ldap:6.5.9

Добавил в градл:


implementation 'org.springframework.ldap:spring-ldap-core:3.3.6'
implementation 'org.springframework.security:spring-security-ldap:6.5.9'

Не помогло. Та же ошибка.

Простая декларация не поможет - Gradle переопределит их более свежими версиями из фреймворка.
Нужно именно форсировать. Один из вариантов (в build.gradle):

configurations.all {
    resolutionStrategy {
        force "org.springframework.ldap:spring-ldap-core:3.3.6"
        force "org.springframework.security:spring-security-ldap:6.5.9"
    }
}

После убедитесь, что в дереве зависимостей (gradle-таска dependencies) отображаются ожидаемые версии.

Профорсировал, проверил дерево зависимостей. В нём такие строки:

org.springframework.ldap:spring-ldap-core:3.2.16 → 3.3.6 (*)

org.springframework.security:spring-security-ldap:6.5.10 → 6.5.9 (c)

До форсирования были такими же.

Не помогло, та же ошибка.

В качестве еще одной экспресс-проверки попробуйте следующее:

configurations.all {
    resolutionStrategy {
        force "org.springframework.security:spring-security-core:6.5.9"
    }
}

если у вас пароли не хранятся в БД, то какая схема аутентификации используется?

судя по тексту ошибки у вас UsernamePassword схема, но она требует пароля из БД

Добрый день.

Проблема в org.springframework.security:spring-security-core - апгрейд 6.5.9 → 6.5.10.

Поменялась внутренняя логика работы DaoAuthenticationProvider, который в LDAP сценарии применяется для аутентификации пользователей, явно подразумевающих стандартную аутентификацию вместо LDAP (свойство jmix.ldap.standard-authentication-users).

Ранее он вовремя отбрасывался и процесс переходил к фазе LDAP-аутентификации.

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

Исправлено в LDAP authentication fails (port to 2.8) · Issue #5391 · jmix-framework/jmix · GitHub, будет в 2.8.3.

С уважением,
Иван