EN · DE · RU · FR · ES

#426: ProjektRight.java

projectforge-business/src/main/java/org/projectforge/business/fibu/ProjektRight.java Typ: Java · Rolle: Finanzbuchhaltung · Quelle: projectforge-business/src/main/java/org/projectforge/business/fibu/ProjektRight.java 125 Zeilen · 76 Code · 40 Kommentare · 9 leer
Zugriffsrechte-Prüfung für Projekt-Operationen. Implementiert PF-Benutzerrechte-ID-Prüfungen und bestimmt CRUD-Berechtigungen pro Modul.

Codestruktur

Paket: org.projectforge.business.fibu

Klassen: ProjektRight

Erweitert: UserRightAccessCheck

Methoden (4): hasSelectAccess, hasSelectAccess, hasAccess, hasHistoryAccess

Felder (1): serialVersionUID

Importe: 5 Pakete

Quellcode (gekürzt)

package org.projectforge.business.fibu;

import org.projectforge.business.user.*;
import org.projectforge.framework.access.OperationType;
import org.projectforge.framework.persistence.user.api.ThreadLocalUserContext;
import org.projectforge.framework.persistence.user.entities.PFUserDO;
import org.projectforge.web.WicketSupport;

/**
 * @author Kai Reinhard (k.reinhard@me.de)
 */
public class ProjektRight extends UserRightAccessCheck<ProjektDO>
{
  private static final long serialVersionUID = -3712738266564403670L;

  public ProjektRight()
  {
    super(UserRightId.PM_PROJECT, UserRightCategory.PM,
        UserRightServiceImpl.FALSE_READONLY_READWRITE);
    initializeUserGroupsRight(UserRightServiceImpl.FALSE_READONLY_READWRITE, UserRightServiceImpl.FIBU_ORGA_PM_GROUPS)
        // Alle Projektmanager haben Nur-Lese-Zugriff:
        .setAvailableGroupRightValues(ProjectForgeGroup.PROJECT_MANAGER, UserRightValue.READONLY)
        // Alle Projektassistenten haben keinen, Lese- oder Nur-Lese-Zugriff:
        .setAvailableGroupRightValues(ProjectForgeGroup.PROJECT_ASSISTANT, UserRightValue.READONLY)
        // Nur-Lese-Zugriff für Controlling-Benutzer:
        .setReadOnlyForControlling();
  }

  /**
   * @return True, wenn {@link UserRightId#PM_PROJECT} für den Benutzer potenziell verfügbar ist (unabhängig vom
   * konfigurierten Wert).
   * @see org.projectforge.business.user.UserRightAccessCheck#hasSelectAccess(org.projectforge.framework.access.AccessChecker,
   * org.projectforge.framework.persistence.user.entities.PFUserDO)
   */
  @Override
  public boolean hasSelectAccess(final PFUserDO user)
  {
    return WicketSupport.getAccessChecker().isAvailable(user, UserRightId.PM_PROJECT);
  }

  @Override
  public boolean hasSelectAccess(final PFUserDO user, final ProjektDO obj)
  {
    if (obj == null) {
      return true;
    }
    var accessChecker = WicketSupport.getAccessChecker();
    if (accessChecker.isUserMemberOfGroup(user, ProjectForgeGroup.CONTROLLING_GROUP)) {
      return true;
    }
    if (accessChecker.isUserMemberOfGroup(user, ProjectForgeGroup.PROJECT_MANAGER,
        ProjectForgeGroup.PROJECT_ASSISTANT)) {
      Long userId = user.getId();
      Long headOfBusinessManagerId = obj.getHeadOfBusinessManager() != null ? obj.getHeadOfBusinessManager().getId() : null;
      Long projectManagerId = obj.getProjectManager() != null ? obj.getProjectManager().getId() : null;
      Long salesManageId = obj.getSalesManager() != null ? obj.getSalesManager().getId() : null;
      if (userId != null && (userId.equals(headOfBusinessManagerId) || userId.equals(projectManagerId) || userId.equals(salesManageId))) {
        return true;
      }

      final UserGroupCache userGroupCache = UserGroupCache.getInstance();
      if (obj.getProjektManagerGroup() != null
          && userGroupCache.isUserMemberOfGroup(ThreadLocalUserContext.getLoggedInUserId(),
          obj.getProjektManagerGroupId())) {
        if ((obj.getStatus() == null || !obj.getStatus().isIn(ProjektStatus.ENDED))
            && !obj.getDeleted()) {
          // Ein Projektleiter sieht keine nicht aktiven oder gelöschten Projekte.
          return true;
        }
      }
      if (accessChecker.isUserMemberOfGroup(user, ProjectForgeGroup.ORGA_TEAM,
          ProjectForgeGroup.FINANCE_GROUP)) {
        return accessChecker.hasReadAccess(user, getId(), false);
      }
      return false;
    } else {
      return accessChecker.hasReadAccess(user, getId(), false);
    }
  }

  @Override
  public boolean hasAccess(final PFUserDO user, final ProjektDO obj, final ProjektDO oldObj,
      final OperationType operationType)
  {
    return WicketSupport.getAccessChecker().hasRight(user, getId(), UserRightValue.READWRITE);
  }

  /**
   * Historienzugriff nur für Benutzer mit Lese- und/oder Schreibzugriff erlaubt.
   *
   * @see org.projectforge.business.user.UserRightAccessCheck#hasHistoryAccess(java.lang.Object)
   */
  @Override
  public boolean hasHistoryAccess(final PFUserDO user, final ProjektDO obj)
  {
    var accessChecker = WicketSupport.getAccessChecker();
    if (accessChecker.isUserMemberOfGroup(user, ProjectForgeGroup.CONTROLLING_GROUP)) {
      return true;
    }
    return accessChecker.hasRight(user, getId(), UserRightValue.READWRITE);
  }
}

Git-Verlauf

868d6abb7 2025 -> 2026
63081666f Quellcode-Dateiköpfe: 2024 -> 2025.
67805f2fc ThreadLocalUserContext.user -> ThreadLocalUserContext.loggedInUser (umbenannt, um Missverständnisse im Code zu vermeiden).
4c04cfd65 GROSSE-ÄNDERUNG! Migration von Integer-IDs zu Long-IDs (einschließlich Fremdschlüsseln usw.)
4efcbd0fb Migration in Arbeit...