EN · DE · RU · FR · ES

#507: LdapSlaveLoginHandler.java

projectforge-business/src/main/java/org/projectforge/business/ldap/LdapSlaveLoginHandler.java Typ: Java · Rolle: LDAP-Integration · Quelle: projectforge-business/src/main/java/org/projectforge/business/ldap/LdapSlaveLoginHandler.java 355 Zeilen · 238 Code · 97 Kommentare · 20 leer
Quellcodedatei unter projectforge-business/src/main/java/org/projectforge/business/ldap/LdapSlaveLoginHandler.java mit Java-Code für die LDAP-Integrationsschicht.

Codestruktur

Paket: org.projectforge.business.ldap

Klassen: LdapSlaveLoginHandler

Enums: Mode

Erweitert: LdapLoginHandler

Methoden (12): initialize, checkLogin, getAllGroups, getAllUsers, getUser, isPasswordChangeSupported, isWlanPasswordChangeSupported, afterUserGroupCacheRefresh, run, isRefreshInProgress, updateLdap, call

Felder (3): userGroupCache, mode, refreshInProgress

Importe: 15 Pakete

Quellcode (gekürzt)

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;

/**
 * Dieser LDAP-Login-Handler fungiert als LDAP-Slave, d.h. auf LDAP wird im Nur-Lese-Modus zugegriffen. Es stehen 3
 * Modi zur Verfügung: einfach, Benutzer und Benutzer-Gruppen.
 * <h4>Einfacher Modus</h4> Der einfache Modus wird angenommen, wenn in der config.xml kein ldap managerUser angegeben ist.
 * <ul>
 * <li>Einfach bedeutet, dass nur Benutzername und Passwort überprüft werden; alle anderen Benutzereinstellungen wie zugewiesene Gruppen und
 * Benutzername etc. werden von ProjectForge verwaltet.</li>
 * <li>Es wird kein LDAP-Benutzer benötigt, um auf Benutzer oder Gruppen von LDAP zuzugreifen; nur der Login-Name und das Passwort des Benutzers werden
 * durch einen Authentifizierungsversuch überprüft!</li>
 * <li>Wenn ein Benutzer in LDAP deaktiviert ist, hat der Benutzer die Möglichkeit, uneingeschränkt mit ProjectForge zu arbeiten, solange er
 * seine „Angemeldet bleiben“-Methode verwendet! (Falls nicht akzeptabel, verwenden Sie stattdessen den normalen Benutzermodus.)</li>
 * <li>Für lokale Benutzer werden alle LDAP-Einstellungen ignoriert.</li>
 * </ul>
 * <h4>Normaler Benutzermodus</h4> Der normale Benutzermodus wird angenommen, wenn in der config.xml ein ldap managerUser angegeben ist.
 * <ul>
 * <li>Normal bedeutet, dass Benutzername und Passwort überprüft werden und alle anderen Benutzereinstellungen wie Benutzername etc. von
 * einem angegebenen LDAP-Manager-Benutzer gelesen werden.</li>
 * <li>Wenn ein Benutzer in LDAP gelöscht wird, wird der Benutzer auch in der ProjectForge-Datenbank als gelöscht markiert. Ein Login nach der
 * Synchronisierung ist nicht erlaubt (die „Angemeldet bleiben“-Funktion funktioniert auch für gelöschte Benutzer nicht).</li>
 * <li>Für lokale Benutzer werden alle LDAP-Einstellungen ignoriert.</li>
 * <li>Alle bekannten LDAP-Benutzerfelder der Benutzer werden synchronisiert (Vorname, Nachname, E-Mail etc.).</li>
 * </ul>
 * <h4>Benutzer-Gruppen-Modus</h4> Noch nicht unterstützt. Es werden keine Gruppen synchronisiert.
 *
 * @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;

  /**
   * Nur für Testfälle.
   *
   * @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("Gruppen werden von diesem LDAP-Handler noch nicht unterstützt.");
    } else {
      mode = Mode.USERS;
    }
    switch (mode) {
      case SIMPLE:
        log.info("LDAP-Slave-Login-Handler arbeitet im Modus 'einfach'.");
        break;
      case USERS:
        log.info("LDAP-Slave-Login-Handler arbeitet im Modus 'benutzer'.");
        break;
      case USER_GROUPS:
        log.info("LDAP-Slave-Login-Handler arbeitet im Modus 'benutzer_gruppen'.");
        break;
    }
  }

  /**
   * Verwendet die Standardimplementierung {@link LoginDefaultHandler#checkLogin(String, char[])} für lokale Benutzer. Für alle
   * anderen Benutzer wird eine LDAP-Authentifizierung überprüft. Wenn die LDAP-Authentifizierung fehlschlägt, wird
   * {@link LoginResultStatus#FAILED} zurückgegeben. Bei Erfolg wird {@link LoginResultStatus#SUCCESS} mit
   * den Benutzereinstellungen der ProjectForge-Datenbank zurückgegeben. Wenn der Benutzer noch nicht in der ProjectForge-Datenbank existiert, wird er
   * danach erstellt und dann zurückgegeben.
   *
   * @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("Benutzer-Login fehlgeschlagen: " + username);
// ... (gekürzt, insgesamt 333 Zeilen)

Git-Verlauf

868d6abb7 2025 -> 2026
63081666f Quelldatei-Header: 2024 -> 2025.
3c42485eb Migration in Arbeit... (alle Tests aller Pakete: OK).
1b50060c3 BaseDao: umbenannt: get -> find, save -> insert, getList -> select, load -> select
87aaf6a5a Migration in Arbeit... BaseDao umgestaltet (noch nicht abgeschlossen) interne* Methoden umbenannt.