EN · DE · RU · FR · ES

#507: LdapSlaveLoginHandler.java

projectforge-business/src/main/java/org/projectforge/business/ldap/LdapSlaveLoginHandler.java Tipo: Java · Rol: Integración LDAP · Fuente: projectforge-business/src/main/java/org/projectforge/business/ldap/LdapSlaveLoginHandler.java 355 líneas · 238 código · 97 comentarios · 20 en blanco
Archivo de código fuente en projectforge-business/src/main/java/org/projectforge/business/ldap/LdapSlaveLoginHandler.java que contiene código Java para la capa de Integración LDAP.

Estructura del código

Paquete: org.projectforge.business.ldap

Clases: LdapSlaveLoginHandler

Enumeraciones: Mode

Extiende: LdapLoginHandler

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

Campos (3): userGroupCache, mode, refreshInProgress

Importaciones: 15 paquetes

Código fuente (resumido)

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;

/**
 * Este manejador de inicio de sesión LDAP actúa como un esclavo LDAP, lo que significa que se accederá a LDAP en modo
 * de solo lectura. Hay 3 modos disponibles: simple, usuarios y usuarios-grupos.
 * <h4>Modo simple</h4> Se asume el modo simple si no se proporciona un usuario administrador de LDAP en el config.xml.
 * <ul>
 * <li>Simple significa que solo se verifican el nombre de usuario y la contraseña; todas las demás configuraciones de
 * usuario, como grupos asignados y nombre de usuario, son gestionadas por ProjectForge.</li>
 * <li>No se necesita un usuario LDAP para acceder a usuarios o grupos de LDAP; solo se verifica el nombre de inicio de
 * sesión y la contraseña del usuario intentando autenticarse.</li>
 * <li>Si un usuario está desactivado en LDAP, el usuario tiene la posibilidad de trabajar con ProjectForge sin
 * limitaciones mientras use su método de sesión persistente (si no es aceptable, use el modo de usuario normal).</li>
 * <li>Para usuarios locales, cualquier configuración LDAP se ignora.</li>
 * </ul>
 * <h4>Modo de usuarios normal</h4> Se asume el modo de usuario normal si se proporciona un usuario administrador de LDAP
 * en el config.xml.
 * <ul>
 * <li>Normal significa que se verifican el nombre de usuario y la contraseña, y todas las demás configuraciones de
 * usuario, como el nombre de usuario, son leídas por un usuario administrador de LDAP proporcionado.</li>
 * <li>Si un usuario se elimina en LDAP, el usuario también se marcará como eliminado en la base de datos de
 * ProjectForge. No se permite ningún inicio de sesión después de la sincronización (la función de sesión persistente
 * también falla para usuarios eliminados).</li>
 * <li>Para usuarios locales, cualquier configuración LDAP se ignora.</li>
 * <li>Todos los campos de usuario LDAP conocidos de los usuarios se sincronizan (nombre, apellido, correo electrónico,
 * etc.).</li>
 * </ul>
 * <h4>Modo usuarios-grupos</h4> Aún no compatible. No se sincronizarán grupos.
 *
 * @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;

  /**
   * Solo para casos de prueba.
   *
   * @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("Los grupos aún no son compatibles con este manejador LDAP.");
    } else {
      mode = Mode.USERS;
    }
    switch (mode) {
      case SIMPLE:
        log.info("El manejador de inicio de sesión esclavo LDAP funciona en modo 'simple'.");
        break;
      case USERS:
        log.info("El manejador de inicio de sesión esclavo LDAP funciona en modo 'usuarios'.");
        break;
      case USER_GROUPS:
        log.info("El manejador de inicio de sesión esclavo LDAP funciona en modo 'usuarios_grupos'.");
        break;
    }
  }

  /**
   * Utiliza la implementación estándar {@link LoginDefaultHandler#checkLogin(String, char[])} para usuarios locales.
   * Para todos los demás usuarios se verifica una autenticación LDAP. Si la autenticación LDAP falla, se devuelve
   * {@link LoginResultStatus#FAILED}. Si es exitosa, se devuelve {@link LoginResultStatus#SUCCESS} con la
   * configuración de usuario de la base de datos de ProjectForge. Si el usuario aún no existe en la base de datos de
   * ProjectForge, se creará después y luego se devolverá.
   *
   * @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("Inicio de sesión de usuario fallido: " + username);
// ... (truncado, total 333 líneas)

Historial de Git

868d6abb7 2025 -> 2026
63081666f Encabezados de archivos fuente: 2024-> 2025.
3c42485eb Trabajo de migración en progreso... (todas las pruebas de todos los paquetes: OK).
1b50060c3 BaseDao: renombrado: get -> find, save -> insert, getList -> select, load -> select
87aaf6a5a Trabajo de migración en progreso... BaseDao refactorizado (aún no terminado) métodos internal* renombrados.