Начало работы с LDAP

Давайте рассмотрим сценарий, когда мы будем использовать LDAP-аутентификацию и управлять пользователями в приложении.

Сначала добавьте дополнение LDAP в ваш проект в соответствии с разделом установки.

Настройка основных свойств

Теперь добавьте основные свойства LDAP. Мы будем использовать тестовый LDAP-сервер - \ldap://ldap.forumsys.com:389/, на котором есть несколько тестовых пользователей.

jmix.ldap.urls = ldap://ldap.forumsys.com:389/ 
jmix.ldap.base-dn = dc=example,dc=com
jmix.ldap.manager-dn = cn=read-only-admin,dc=example,dc=com
jmix.ldap.manager-password = password
jmix.ldap.user-search-filter = (uid={0})

jmix.ldap.default-roles содержит список ролей, которые будут назначены каждому пользователю, аутентифицированному через LDAP. Это необходимо, поскольку пользователь без каких-либо ролей не сможет войти в приложение.

Установите свойство jmix.ldap.default-roles в значение ui-minimal.

jmix.ldap.default-roles=ui-minimal

Подробнее о значении каждого свойства вы можете узнать в разделе Свойства LDAP.

Настройка синхронизации

Теперь нам нужно описать способ синхронизации пользователей.

Мы реализуем сценарий по умолчанию, когда дополнение аутентифицирует пользователей из приложения через LDAP. Если пользователь успешно аутентифицирован в LDAP, но у него нет UserDetails в приложении, он будет автоматически синхронизирован, и UserDetails будет создан в соответствии с соответствующей записью LDAP.

Объявим бин, реализующий интерфейс LdapUserDetailsSynchronizationStrategy. Дополнение поставляется с базовой абстрактной реализацией: AbstractLdapUserDetailsSynchronizationStrategy, поэтому в простом случае стратегию можно объявить, просто указав конкретный класс User и реализовав простое отображение:

@Component("ldap_CustomUserSynchronizationStrategy")
public class CustomUserSynchronizationStrategy extends AbstractLdapUserDetailsSynchronizationStrategy<User> {

    private String getFirstName(String fullName) {
        return fullName.split(" ")[0];
    }

    @Override
    protected Class<User> getUserClass() {
        return User.class;
    }

    @Override
    protected void mapUserDetailsAttributes(User userDetails, DirContextOperations ctx) {
        userDetails.setFirstName(getFirstName(ctx.getStringAttribute("cn")));
        userDetails.setLastName(ctx.getStringAttribute("sn"));
        userDetails.setEmail(ctx.getStringAttribute("mail"));
    }
}

Обратите внимание, что AbstractLdapUserDetailsSynchronizationStrategy также сохраняет назначения ролей, полученные в процессе сопоставления ролей. После каждого выполнения синхронизации назначения ролей перезаписываются новыми. Это делается для того, чтобы не сохранять устаревшие назначения ролей.

Итак, установим свойство jmix.ldap.synchronize-role-assignments в false, чтобы управлять ролями пользователей вручную в приложении.

После объявления стратегии синхронизации пользователи будут синхронизироваться при каждом входе в систему. Если вы хотите отключить синхронизацию пользователей при входе, установите свойство jmix.ldap.synchronize-user-on-login в false.

Если вы хотите полностью управлять пользователями в LDAP и не поддерживать их в приложении, смотрите раздел Управление пользователями в памяти.