EN · DE · RU · FR · ES

#507 : LdapSlaveLoginHandler.java

projectforge-business/src/main/java/org/projectforge/business/ldap/LdapSlaveLoginHandler.java Type : Java · Rôle : Intégration LDAP · Source : projectforge-business/src/main/java/org/projectforge/business/ldap/LdapSlaveLoginHandler.java 355 lignes · 238 code · 97 commentaires · 20 vides
Fichier source à projectforge-business/src/main/java/org/projectforge/business/ldap/LdapSlaveLoginHandler.java contenant le code Java pour la couche d'intégration LDAP.

Structure du code

Package : org.projectforge.business.ldap

Classes : LdapSlaveLoginHandler

Énumérations : Mode

Étend : LdapLoginHandler

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

Champs (3) : userGroupCache, mode, refreshInProgress

Importations : 15 packages

Code source (abrégé)

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;

/**
 * Ce gestionnaire de connexion LDAP agit comme un esclave LDAP, ce qui signifie que le LDAP sera accédé en mode lecture seule. Il y a 3
 * modes disponibles : simple, users et users-groups.
 * <h4>Mode simple</h4> Le mode simple est supposé si aucun managerUser ldap n'est donné dans le config.xml.
 * <ul>
 * <li>Simple signifie que seuls le nom d'utilisateur et le mot de passe sont vérifiés, tous les autres paramètres utilisateur tels que les groupes assignés et le nom
 * d'utilisateur etc. sont gérés par ProjectForge.</li>
 * <li>Aucun utilisateur ldap n'est nécessaire pour accéder aux utilisateurs ou groupes de LDAP, seul le nom de connexion et le mot de passe de l'utilisateur sont vérifiés
 * en essayant de s'authentifier !</li>
 * <li>Si un utilisateur est désactivé dans LDAP, l'utilisateur a la possibilité de travailler avec ProjectForge de manière illimitée tant qu'il
 * utilise sa méthode de connexion persistante ! (Si cela n'est pas acceptable, veuillez utiliser le mode utilisateur normal à la place.)</li>
 * <li>Pour les utilisateurs locaux, tout paramètre LDAP est ignoré.</li>
 * </ul>
 * <h4>Mode utilisateurs normal</h4> Le mode utilisateur normal est supposé si un managerUser ldap est donné dans le config.xml.
 * <ul>
 * <li>Normal signifie que le nom d'utilisateur et le mot de passe sont vérifiés et tous les autres paramètres utilisateur tels que le nom d'utilisateur etc. sont lus par
 * un utilisateur manager ldap donné.</li>
 * <li>Si un utilisateur est supprimé dans LDAP, l'utilisateur sera marqué comme supprimé également dans la base de données de ProjectForge. Toute connexion après
 * synchronisation n'est pas autorisée (la fonction de connexion persistante échoue également pour les utilisateurs supprimés).</li>
 * <li>Pour les utilisateurs locaux, tout paramètre LDAP est ignoré.</li>
 * <li>Tous les champs utilisateur ldap connus des utilisateurs sont synchronisés (prénom, nom, e-mail, etc.).</li>
 * </ul>
 * <h4>Mode utilisateurs-groupes</h4> Pas encore supporté. Aucun groupe ne sera synchronisé.
 *
 * @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;

  /**
   * Uniquement pour les cas de test.
   *
   * @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("Les groupes ne sont pas encore supportés par ce gestionnaire LDAP.");
    } else {
      mode = Mode.USERS;
    }
    switch (mode) {
      case SIMPLE:
        log.info("Le gestionnaire de connexion esclave LDAP fonctionne en mode 'simple'.");
        break;
      case USERS:
        log.info("Le gestionnaire de connexion esclave LDAP fonctionne en mode 'utilisateurs'.");
        break;
      case USER_GROUPS:
        log.info("Le gestionnaire de connexion esclave LDAP fonctionne en mode 'utilisateurs_groupes'.");
        break;
    }
  }

  /**
   * Utilise l'implémentation standard {@link LoginDefaultHandler#checkLogin(String, char[])} pour les utilisateurs locaux. Pour tous
   * les autres utilisateurs, une authentification LDAP est vérifiée. Si l'authentification LDAP échoue, alors
   * {@link LoginResultStatus#FAILED} est retourné. En cas de succès, {@link LoginResultStatus#SUCCESS} est retourné avec
   * les paramètres utilisateur de la base de données ProjectForge. Si l'utilisateur n'existe pas encore dans la base de données de ProjectForge, il sera
   * créé après et ensuite retourné.
   *
   * @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("Échec de la connexion utilisateur : " + username);
// ... (tronqué, total 333 lignes)

Historique Git

868d6abb7 2025 -> 2026
63081666f En-têtes des fichiers source : 2024 -> 2025.
3c42485eb Migration en cours... (tous les tests de tous les packages : OK).
1b50060c3 BaseDao : renommé : get -> find, save -> insert, getList -> select, load -> select
87aaf6a5a Migration en cours... BaseDao refactoré (pas encore terminé) méthodes internes* renommées.