LdapSlaveLoginHandler.javaprojectforge-business/src/main/java/org/projectforge/business/ldap/LdapSlaveLoginHandler.java mit Java-Code für die LDAP-Integrationsschicht.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
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)
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.