Начало работы с 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 и не поддерживать их в приложении, смотрите раздел Управление пользователями в памяти.