LdapSlaveLoginHandler.javaprojectforge-business/src/main/java/org/projectforge/business/ldap/LdapSlaveLoginHandler.java que contiene código Java para la capa de Integración LDAP.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
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)
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.