EN · DE · RU · FR · ES

#507: LdapSlaveLoginHandler.java

projectforge-business/src/main/java/org/projectforge/business/ldap/LdapSlaveLoginHandler.java Тип: Java · Роль: Интеграция LDAP · Источник: projectforge-business/src/main/java/org/projectforge/business/ldap/LdapSlaveLoginHandler.java 355 строк · 238 кода · 97 комментариев · 20 пустых
Файл исходного кода projectforge-business/src/main/java/org/projectforge/business/ldap/LdapSlaveLoginHandler.java, содержащий Java-код для уровня интеграции LDAP.

Структура кода

Пакет: org.projectforge.business.ldap

Классы: LdapSlaveLoginHandler

Перечисления: Mode

Расширяет: LdapLoginHandler

Методы (12): initialize, checkLogin, getAllGroups, getAllUsers, getUser, isPasswordChangeSupported, isWlanPasswordChangeSupported, afterUserGroupCacheRefresh, run, isRefreshInProgress, updateLdap, call

Поля (3): userGroupCache, mode, refreshInProgress

Импорты: 15 пакетов

Исходный код (сокращённый)

package org.projectforge.business.ldap;

import org.apache.commons.lang3.StringUtils;
import org.projectforge.business.login.LoginDefaultHandler;
import org.projectforge.business.login.LoginHandler;
import org.projectforge.business.login.LoginResult;
import org.projectforge.business.login.LoginResultStatus;
import org.projectforge.business.user.UserGroupCache;
import org.projectforge.framework.persistence.api.EntityCopyStatus;
import org.projectforge.framework.persistence.user.entities.GroupDO;
import org.projectforge.framework.persistence.user.entities.PFUserDO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.naming.NameNotFoundException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * Этот обработчик входа LDAP действует как подчинённый LDAP, то есть LDAP будет доступен в режиме только для чтения.
 * Доступны 3 режима: простой, пользователи и пользователи-группы.
 * <h4>Простой режим</h4> Простой режим предполагается, если в config.xml не указан managerUser для LDAP.
 * <ul>
 * <li>Простой означает, что проверяются только имя пользователя и пароль; все остальные настройки пользователя,
 * такие как назначенные группы, имя пользователя и т.д., управляются ProjectForge.</li>
 * <li>Для доступа к пользователям или группам LDAP не требуется пользователь LDAP; проверяются только имя входа
 * и пароль пользователя путём попытки аутентификации!</li>
 * <li>Если пользователь деактивирован в LDAP, он может неограниченно работать с ProjectForge, пока использует
 * метод stay-logged-in! (Если это неприемлемо, используйте обычный режим пользователя.)</li>
 * <li>Для локальных пользователей любые настройки LDAP игнорируются.</li>
 * </ul>
 * <h4>Обычный режим пользователей</h4> Обычный режим пользователей предполагается, если в config.xml указан
 * managerUser для LDAP.
 * <ul>
 * <li>Обычный означает, что проверяются имя пользователя и пароль, а все остальные настройки пользователя,
 * такие как имя пользователя и т.д., считываются указанным менеджером LDAP.</li>
 * <li>Если пользователь удалён в LDAP, он будет помечен как удалённый также в базе данных ProjectForge.
 * Любой вход после синхронизации запрещён (функция stay-logged-in также не работает для удалённых пользователей).</li>
 * <li>Для локальных пользователей любые настройки LDAP игнорируются.</li>
 * <li>Все известные поля пользователя LDAP синхронизируются (имя, фамилия, email и т.д.).</li>
 * </ul>
 * <h4>Режим пользователи-группы</h4> Пока не поддерживается. Группы синхронизироваться не будут.
 *
 * @author Kai Reinhard (k.reinhard@micromata.de)
 */
@Service
public class LdapSlaveLoginHandler extends LdapLoginHandler {
  private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LdapSlaveLoginHandler.class);

  @Autowired
  PFUserDOConverter pfUserDOConverter;

  @Autowired
  private UserGroupCache userGroupCache;

  enum Mode {
    SIMPLE, USERS, USER_GROUPS
  }

  private Mode mode;

  private boolean refreshInProgress;

  /**
   * Только для тестовых случаев.
   *
   * @param mode
   */
  void setMode(final Mode mode) {
    this.mode = mode;
  }

  /**
   * @see org.projectforge.business.ldap.LdapLoginHandler#initialize()
   */
  @Override
  public void initialize() {
    super.initialize();
    if (StringUtils.isBlank(ldapConfig.getManagerUser())) {
      mode = Mode.SIMPLE;
    } else if (StringUtils.isNotBlank(ldapConfig.getGroupBase())) {
      mode = Mode.USERS;// Mode.USER_GROUPS;
      log.warn("Группы пока не поддерживаются этим обработчиком LDAP.");
    } else {
      mode = Mode.USERS;
    }
    switch (mode) {
      case SIMPLE:
        log.info("Обработчик входа подчинённого LDAP работает в режиме 'простой'.");
        break;
      case USERS:
        log.info("Обработчик входа подчинённого LDAP работает в режиме 'пользователи'.");
        break;
      case USER_GROUPS:
        log.info("Обработчик входа подчинённого LDAP работает в режиме 'пользователи_группы'.");
        break;
    }
  }

  /**
   * Использует стандартную реализацию {@link LoginDefaultHandler#checkLogin(String, char[])} для локальных
   * пользователей. Для всех остальных пользователей проверяется аутентификация LDAP. Если аутентификация LDAP
   * не удалась, возвращается {@link LoginResultStatus#FAILED}. В случае успеха возвращается
   * {@link LoginResultStatus#SUCCESS} с настройками пользователя из базы данных ProjectForge. Если пользователь
   * ещё не существует в базе данных ProjectForge, он будет создан после и затем возвращён.
   *
   * @see LoginHandler#checkLogin(String, char[])
   */
  @Override
  public LoginResult checkLogin(final String username, final char[] password) {
    PFUserDO user = userService.getInternalByUsername(username);
    if (user != null && user.getLocalUser()) {
      return loginDefaultHandler.checkLogin(username, password);
    }
    final LoginResult loginResult = new LoginResult();
    final String organizationalUnits = ldapConfig.getUserBase();
    final LdapUser ldapUser = ldapUserDao.authenticate(username, password, organizationalUnits);
    if (ldapUser == null) {
      log.info("Вход пользователя не удался: " + username);
// ... (сокращено, всего 333 строки)

История Git

868d6abb7 2025 -> 2026
63081666f Заголовки файлов исходного кода: 2024-> 2025.
3c42485eb Миграция в процессе... (все тесты всех пакетов: OK).
1b50060c3 BaseDao: переименовано: get -> find, save -> insert, getList -> select, load -> select
87aaf6a5a Миграция в процессе... BaseDao рефакторинг (ещё не завершён) внутренние* методы переименованы.