-
Notifications
You must be signed in to change notification settings - Fork 2
Description
Status Quo
ZMS verwendet ein zweidimensionales, stufenbasiertes Berechtigungsmodell, bei welchem die Rechte eines Benutzers als einzelner nummerischer Wert (Berechtigung) in der Datenbank (nutzer Tabelle) gespeichert werden und höhere Stufen automatisch alle Berchtigungen der unteren Stufen übernehmen.
1. Dimension: funktionale Berechtigungsstufen
RightsLevelManager.php (excerpt)
public static $possibleRights = array(
'superuser' => 90, // Technische Administration / Superuser
'organisation' => 70, // Referatsübergreifende Administration (wird in zmsadmin nicht genutzt)
'department' => 50, // Behördenübergreifende Administration (wird in zmsadmin nicht genutzt)
'cluster' => 40, // Fachliche Administration
'useraccount' => 40, // Fachliche Administration
'scope' => 30, // Terminadministration
'departmentStats' => 25, // wird in zmsadmin nicht genutzt
'availability' => 20, // wird in zmsadmin nicht genutzt
'ticketprinter' => 15, // wird in zmsadmin nicht genutzt
'sms' => 10, // wird in zmsadmin nicht genutzt
'audit' => 5, // Innenrevision
'basic' => 0 // Sachbearbeitung
);
Vererbung
Useraccount.php (excerpt)
public function getEntityMapping()
{
return [
'id' => 'useraccount.Name',
'password' => 'useraccount.Passworthash',
'lastLogin' => 'useraccount.lastUpdate',
'rights__superuser' => self::expression('`useraccount`.`Berechtigung` = 90'),
'rights__organisation' => self::expression('`useraccount`.`Berechtigung` >= 70'),
'rights__department' => self::expression('`useraccount`.`Berechtigung` >= 50'),
'rights__cluster' => self::expression('`useraccount`.`Berechtigung` >= 40'),
'rights__useraccount' => self::expression('`useraccount`.`Berechtigung` >= 40'),
'rights__scope' => self::expression('`useraccount`.`Berechtigung` >= 30'),
'rights__departmentStats' => self::expression('`useraccount`.`Berechtigung` >= 25'),
'rights__availability' => self::expression('`useraccount`.`Berechtigung` >= 20'),
'rights__ticketprinter' => self::expression('`useraccount`.`Berechtigung` >= 15'),
'rights__sms' => self::expression('`useraccount`.`Berechtigung` >= 10'),
'rights__audit' => self::expression('`useraccount`.`Berechtigung` = 5 OR `useraccount`.`Berechtigung` = 90'),
'rights__basic' => self::expression('`useraccount`.`Berechtigung` >= 0'),
];
}
Beispiel: Ein User, welcher über ZMS-Admin mit der Rolle Terminadmin (= scope) angelegt wurde, erhält zusätzlich alle darunter liegenden Stufen. Eine Ausnahme hiervon bildet lediglich die Rolle audit - sie kann nur explizit zugewiesen oder in der Rolle superuser vererbt werden.
{
"$schema": "https://schema.berlin.de/queuemanagement/useraccount.json",
"rights": {
"superuser": 0,
"organisation": 0,
"department": 0,
"cluster": 0,
"useraccount": 0,
"scope": 1,
"departmentStats": 1,
"availability": 1,
"ticketprinter": 1,
"sms": 1,
"audit": 0, // Sonderrolle
"basic": 1
},
"id": "fabian-terminadmin",
"password": "***********************",
"lastLogin": 1764575771
}
2. Dimension: Nutzer-Behörden-Zuordnung
Benutzer werden explizit einer oder mehrerer Behörden zugewiesen. Über diese Zuordnung wird gesteuert, auf welche Daten der Nutzer zugreifen. Superuser umgehen diese Zuordnung vollständig - ihnen wird lediglich die fiktionale behoerdenid "0" zugewiesen.
zms.sql (excerpt)
CREATE TABLE `nutzerzuordnung` (
`nutzerid` int(5) NOT NULL, // Fremdschlüssel für Nutzer
`behoerdenid` int(5) NOT NULL // Fremdschlüssel für Behörde
)
3. Zugriffsprüfung
Backend
Im Backend erfolgt die Zugriffsprüfung über verschiedene Methoden der User- und Useraccount-Klassen. Am häufigsten wird hiebei die Methode checkRights(string ...$rights) verwendet, welche in fast allen zmsapi-Controllern in der ersten Zeile verwendet wird. Sie lädt die Workstation und ruft testRights() auf, welche widerum die hasRights() Methode wrapped. In der hasRights() Methode erfolgt die eigentlich Prüfung. Wichtig: es wird über alle geforderten Rechte iteriert und nur true returned, wenn alle Rehte vorhanden sind.
Useraccount.php (excerpt)
public function hasRights(array $requiredRights)
{
if ($this->isSuperUser()) {
return true;
}
foreach ($requiredRights as $required) {
if ($required instanceof Useraccount\RightsInterface) {
if (!$required->validateUseraccount($this)) {
return false;
}
} elseif (! $this->toProperty()->rights->$required->get()) {
return false;
}
}
return true;
}
Frontend
Im Frontend werden bestimmte UI-Elemente je nach Nutzer-Rechten ein- bzw. ausgeblendet. Dies erfolgt in den Twig-Templates meist anhand des übergebenen workstation-Objekts und den darin enthaltenen useraccount-Daten.
navigation.twig (excerpt)
{% if rights.ticketprinter and workstation.scope.id %}
{% if workstation.useraccount.rights.superuser %}
<li class="nav__link{{ menuActive == 'calldisplay'? ' active' }}">
<a title="{% trans %}Standortauswahlseite der Aufrufanlage{% endtrans %}" href="{{ urlGet('calldisplay', {}, {}) }}" {{ menuActive == 'calldisplay'? ' aria-current="page"' }}>Anzeige Aufrufsystem</a>
</li>
<li class="nav__link{{ menuActive == 'ticketprinter'? ' active' }}">
<a title="{% trans %}Standortauswahlseite der Wartenummernausgabe{% endtrans %}" href="{{ urlGet('ticketprinter', {}, {}) }}" {{ menuActive == 'ticketprinter'? ' aria-current="page"' }}>Wartenummern</a>
</li>
{% endif %}
{% endif %}
{% if workstation.useraccount.rights.scope %}
<li class="nav__link{{ menuActive == 'overviewcalendar'? ' active' }}">
<a title="{% trans %}Gesamtübersicht mit allen Terminen{% endtrans %}"
href="{{ urlGet('overviewcalendar', {}, {}) }}"
{{ menuActive == 'overallcalendar'? ' aria-current="page"' }}>
Gesamtübersicht
</a>
</li>
{% endif %}
Identifizierte Probleme
-
Implizite Vererbung
- Höhere Rollen bekommen automatisch alle niedrigeren Rechte (z. B. erhält fachliche Administration (40) automatisch Terminadministration (30), auch wenn dies nicht gewünscht ist)
- Keine Möglichkeit, Vererbung zu deaktivieren
-
Doppelte Rechte-Level
- Stufe 40 hat zwei Bedeutungen:
clusterunduseraccount(verwirrend)
- Stufe 40 hat zwei Bedeutungen:
-
Fehlende Granularität
- Aktuell keine einfache Möglichkeit für Sachbearbeiter Lite (ohne Warteschlange)
- Keine granularen Rollen (z. B. keine Rolle für reine Nutzerverwaltung)
Zielbild
Atomares Rechte-Modell
Zunächst werden die wesentlichen Interaktionen mit ZMS in Rechte übersetzt. Hierbei empfiehlt es sich, die Rechte so atomar wie möglich zu definieren. Nachfolgend unser initiales Zielbild:
| Permission | Nutzer*in darf... |
|---|---|
appointment |
Sachbearbeiteransicht aufrufen + Termine aufrufen/verwalten/vergeben/verschieben/stornieren (inkl. Benachrichtungsmail senden) |
availability |
Öffnungszeiten erstellen/aktualisieren/löschen (inkl. Sperren und Ausnahmen) |
calldisplay |
Konfiguration/Layouts für Aufrufanzeige anpassen |
cherrypick |
Termine direkt aus der Wartschlange aufrufen (hierfür wird queue benötigt) |
cluster |
Cluster erstellen/aktualiseren/löschen |
config |
Systemkonfiguration anpassen |
counter |
Tresenansicht aufrufen (inkl. Monats- und Wochenkalender) |
customersearch |
Kunden suchen (anstehende Termine, keine Termine aus Vergangenheit) |
dayoff |
Freie Tage festlegen |
department |
Behörde erstellen/aktualiseren/löschen |
emergency |
Notruf auslösen/empfangen |
finishedqueue |
Abgeschlossene Termine sehen |
finishedqueuepast |
Abgeschlossene Termine aus der Vergangenheit anzeigen |
logs |
Logergebnisse sehen |
mailtemplates |
E-Mail-Templates anpassen |
missedqueue |
Verpasste Termine sehen |
openqueue |
Offene Aufrufe sehen |
organisation |
Referat erstellen/aktualiseren/löschen |
overviewcalendar |
Gesamtübersicht aufrufen |
parkedqueue |
Geparkte Termine sehen |
restrictedscope |
Standortkonfiguration lesen und bestimmte Abschnitte der Standortkonfiguration anpassen |
scope |
Standort erstellen/aktualiseren/löschen |
source |
Mandanten anlegen/aktualisieren/löschen (inkl. Pflege von Dienstleister und Dienstleistungen) |
statistic |
Statistiken abrufen/exportieren |
ticketprinter |
Konfiguration für E-Kioske anpassen |
useraccount |
Nutzer*innen erstellen/aktualisieren/löschen/suchen |
waitingqueue |
Wartschlange sehen |
superuser |
alle Funktionen |
Rollen-Rechte-Zuordnung
| Frontend-Rolle | Code/DB-Rollenbezeichnung | Permissions |
|---|---|---|
| Sachbearbeitung beschränkt | agent_basic | appointment, emergency, counter*, customersearch* |
| Sachbearbeitung | agent_queue | appointment, emergency, counter, customersearch, cherrypick, waitingqueue, parkedqueue, missedqueue, openqueue, finishedqueue |
| Sachbearbeitung Plus | agent_queue_plus | appointment, emergency, counter, customersearch, cherrypick, waitingqueue, parkedqueue, missedqueue, openqueue, finishedqueue, overviewcalendar |
| Terminadministration | appointment_admin | appointment, emergency, counter, customersearch, cherrypick, waitingqueue, parkedqueue, missedqueue, openqueue, finishedqueue, overviewcalendar, restrictedscope, statistic |
| Controlling | reporting_viewer | statistic |
| Benutzerverwaltung | user_admin | useraccount |
| Innenrevision | audit_viewer | customersearch, logs |
| Technische Administration | system_admin | superuser |
ERM
(Bewusst neue Naming Convention für neue Tabellen, vgl. #1427)
Umsetzungsplan
Phase 1: Grundlage
| Ticket | Titel | Status |
|---|---|---|
| ZMSKVR-1161 | Tabellen für neues Rollen- und Rechtekonzept anlegen | ✅ Erledigt |
| ZMSKVR-1170 | Migration der bestehenden Nutzer in das neue Rollenmodell (Befüllung user_role) | ✅ Erledigt |
| ZMSKVR-1171 | Backend-Vorarbeiten für atomares Berechtigungsmodell | 🔲 Offen |
Phase 2: Controller & Templates schrittweise umstellen
Die Reihenfolge ist hier grundsätzlich egal.
| Ticket | Titel | Status |
|---|---|---|
| ZMSKVR-1172 | Umstellung Rechteprüfung – Statistik und Innenrevision | 🔲 Offen |
| ZMSKVR-1294 | Umstellung Rechteprüfung – Behörden, Standorte und Öffnungszeiten | 🔲 Offen |
| ZMSKVR-1295 | Umstellung Rechteprüfung – Freie Tage, Mandanten, Mailtemplates, Benachrichtigungen, Wartenummern und Systemkonfiguration | 🔲 Offen |
| ZMSKVR-1296 | Umstellung Rechteprüfung – Sachbearbeitung, Tresen und Warteschlangen | 🔲 Offen |
Phase 3: UI-Umbau
Folgende Tickets sind noch zu erstellen.
- Nutzer-Erstellung/-Änderung: Neue Rollennamen anzeigen + Schreibrichtung ändern
- Vorher: Formular sendet
rights,getRightsLevel()berechnet Berechtigung, Mapping-Logik leitet daraus die neue Rolle ab und schreibt sie inuser_role - Nachher: Formular sendet Rollen direkt in
user_role, Reverse-Mapping leitet daraus die Berechtigung ab - Außerdem: Restliche Controller müssen umgestellt und ggf. noch refactored werden:
UseraccountAdd,UseraccountDelete,UseraccountGet,UseraccountList,UseraccountListByDepartments,UseraccountListByRole,UseraccountListByRoleAndDepartments,UseraccountUpdate
- Vorher: Formular sendet
- Neuer UI-Bereich + CRUD, um Roles und Permissions zu verwalten
Phase 4: Aufräumen
| Ticket | Titel | Status |
|---|---|---|
| ZMSKVR-1173 | Entfernung der Legacy-Berechtigungsstrukturen | 🔲 Offen |
Folgendes muss aufgeräumt werden:
- Datenbank-Tabellen
- Entity und Schema (Fallbacks entfernen)
- Query-Klassen
- Unit Tests
Ticket-Details
ZMSKVR-1170 – Migration der bestehenden Nutzer in das neue Rollenmodell (Befüllung user_role)
User Story
Als Systemadministrator von ZMS
möchte ich die bestehenden Nutzerberechtigungen automatisiert in fachliche Rollen des neuen Rechte-Modells überführen,
damit alle bestehenden Nutzer*innen nach der Umstellung weiterhin arbeitsfähig sind und die neue Rollenlogik technisch genutzt werden kann.
Hintergrundinformationen
Bisher wurden die "Rollen" als einzelner nummerischer Wert (Berechtigung) in der nutzer-Tabelle gespeichert, wobei höhere Stufen automatisch alle Berechtigungen der unteren Stufe übernehmen.
Für die Migration ist eine Übersetzung der bestehenden numerischen Berechtigungsstufen in die neuen fachlichen Rollen notwendig. Das Ergebnis der Migration ist die Befüllung der neuen Verknüpfungstabelle user_role (Nutzer ↔ Rolle).
Relevante Übersetzung der alten Rollen:
| Alte Berechtigung | Bedeutung alt | Neue Rolle |
|---|---|---|
| 90 | Technische Administration | Technische Administration (superuser) |
| 40 | Fachliche Administration | Terminadministration oder Benutzerverwaltung |
| 30 | Terminadministration | Terminadministration |
| 5 | Innenrevision | Innenrevision |
| 0 | Sachbearbeitung | Sachbearbeitung oder Sachbearbeitung beschränkt |
Für die initiale Migration genügt eine vereinfachte Übersetzung der alten Berechtigungsstufen in neue Rollen, um den Systembetrieb sicherzustellen. Alle User der Stufe 40 erhalten die Rolle "Terminadministration", alle User der Stufe 0 erhalten die Rolle "Sachbearbeitung".
Akzeptanzkriterien
- Für alle bestehenden Nutzer*innen wird eine/mehrere Rollen-Zuordnung(en) in der Tabelle user_role angelegt
- Die Übersetzung der alten Berechtigungsstufen erfolgt gemäß der definierten Mapping-Tabelle:
- Nutzer*innen mit Berechtigung = 90 erhalten die Rolle Technische Administration
- Nutzer*innen mit Berechtigung = 40 oder 30 erhalten die Rolle Terminadministration
- Nutzer*innen mit Berechtigung = 5 erhalten die Rolle Innenrevision
- Nutzer*innen mit Berechtigung = 0 erhalten die Rolle Sachbearbeitung
ZMSKVR-1171 – Backend-Vorarbeiten für atomares Berechtigungsmodell
User Story
Als Entwickler*in
möchte ich die technischen Grundlagen für das neue atomare Berechtigungsmodell schaffen, ohne bestehende Funktionalität zu beeinträchtigen,
damit die schrittweise Umstellung der Controller und Frontend-Komponenten in Folgetickets sicher erfolgen kann.
Hintergrundinformationen
Dieses Ticket schafft die Voraussetzungen für die Migration auf das neue Berechtigungsmodell. Alle Änderungen müssen abwärtskompatibel sein: Das bestehende rights-Array bleibt erhalten und wird weiterhin aus den neuen Berechtigungen abgeleitet. Die Controller und Twig-Templates werden in diesem Ticket noch nicht angepasst – sie arbeiten weiterhin mit dem rights-Array.
Betroffene Komponenten:
| Komponente | Datei | Änderung |
|---|---|---|
| JSON-Schema | zmsentities/schema/useraccount.json |
Neues permissions-Objekt hinzufügen |
| Entity | zmsentities/src/Zmsentities/Useraccount.php |
getDefaults(), hasRights(), testRights(), isSuperUser() erweitern/refactoren |
| DB Query | zmsdb/src/Zmsdb/Query/Useraccount.php |
getEntityMapping() und reverseEntityMapping() umstellen |
| Neue Query-Klassen | zmsdb/src/Zmsdb/Query/Permission.php, Role.php, UserRole.php |
Neu anlegen |
Nach Abschluss existieren altes und neues System parallel.
Akzeptanzkriterien
- Das JSON-Schema
useraccount.jsonenthält ein neuespermissions-Objekt Useraccount::getDefaults()liefert sowohlrightsals auchpermissionsgetEntityMapping()befülltrightsweiterhin aus Berechtigung (unverändert) und befüllt zusätzlichpermissionsaus den neuen Tabellen- Superuser erhalten alle Einträge im
permissions-Array auftrue reverseEntityMapping()schreibt sowohl nach Berechtigung als auch nachuser_role(Mapping-Logik aus ZMSKVR-1170 wiederverwendet)- Die alte Benutzerverwaltungs-UI funktioniert weiterhin korrekt und hält Berechtigung und
user_rolekonsistent zueinander hasRights()prüft zuerstpermissions, dann Fallback aufrightsisSuperUser()prüft beide Arrays- Neue Query-Klassen für die neuen Tabellen existieren
checkRights()akzeptiert sowohl alte (scope,basic, ...) als auch neue Berechtigungsnamen (statistic,appointment, ...)
ZMSKVR-1172 – Umstellung Rechteprüfung – Statistik und Innenrevision
User Story
Als Systemadministrator*in
möchte ich, dass die Rechteprüfung im Bereich Statistik und Innenrevision auf die neuen atomaren Berechtigungen umgestellt wird,
damit die schrittweise Ablösung des alten Berechtigungsmodells voranschreitet.
Hintergrundinformationen
Controller:
| Controller | Aktuell | Neu |
|---|---|---|
ProcessLog |
checkRights('audit') |
checkRights('logs') |
WarehousePeriodGet |
checkRights('scope') |
checkRights('statistic') |
WarehousePeriodListGet |
checkRights('scope') |
checkRights('statistic') |
WarehouseSubjectGet |
checkRights('scope') |
checkRights('statistic') |
WarehouseSubjectListGet |
checkRights('scope') |
checkRights('statistic') |
Akzeptanzkriterien
- Rechteprüfung in den Controllern wurde entsprechend der Hintergrundinformationen angepasst
- Nutzer*innen mit der Rolle "Controlling" können Statistiken abrufen
- Nutzer*innen mit der Rolle "Innenrevision" können Log-Ergebnisse in der Kundensuche abrufen
ZMSKVR-1294 – Umstellung Rechteprüfung – Behörden, Standorte und Öffnungszeiten
User Story
Als Systemadministrator*in
möchte ich, dass die Rechteprüfung im Bereich "Behörden und Standorte" sowie Öffnungszeiten auf die neuen atomaren Berechtigungen umgestellt wird,
damit die schrittweise Ablösung des alten Berechtigungsmodells voranschreitet.
Hintergrundinformationen
Controller:
| Controller | Aktuell | Neu |
|---|---|---|
AvailabilityClosureRead |
checkRights('scope') |
checkRights('availability') |
AvailabilityClosureToggle |
checkRights() |
checkRights('availability') oder nur Login-Prüfung? |
AvailabilityDelete |
checkRights() |
checkRights('availability') oder nur Login-Prüfung? |
AvailabilityGet |
checkRights() |
checkRights('availability') oder nur Login-Prüfung? |
AvailabilityListByScope |
checkRights('availability') |
keine Änderung |
AvailabilityListUpdate |
checkRights() |
checkRights('availability') oder nur Login-Prüfung? |
AvailabilitySlotsUpdate |
checkRights() |
checkRights('availability') oder nur Login-Prüfung? |
ClusterCalldisplayImageDataDelete |
checkRights('cluster') |
checkRights('calldisplay') |
ClusterCalldisplayImageDataUpdate |
checkRights('cluster') |
checkRights('calldisplay') |
ClusterDelete |
checkRights('cluster') |
keine Änderung |
ClusterUpdate |
checkRights('cluster') |
keine Änderung |
ConflictListByScope |
checkRights('basic') |
checkRights('availability') |
DepartmentAddCluster |
checkRights('department') |
keine Änderung |
DepartmentAddScope |
checkRights('scope') |
keine Änderung |
DepartmentDelete |
checkRights('department') |
keine Änderung |
DepartmentUpdate |
checkRights('department') |
keine Änderung |
OrganisationAddDepartment |
checkRights('department') |
keine Änderung |
OrganisationDelete |
checkRights('organisation') |
keine Änderung |
OrganisationGet |
checkRights('department') |
keine Änderung |
OrganisationUpdate |
checkRights('organisation') |
keine Änderung |
OverallCalendarRead |
checkRights('scope') |
checkRights('overviewcalendar') |
OwnerAddOrganisation |
checkRights() |
checkRights('organisation') oder nur Login-Prüfung? |
OwnerDelete |
checkRights() |
checkRights('organisation') oder nur Login-Prüfung? |
OwnerGet |
checkRights() |
checkRights('organisation') oder nur Login-Prüfung? |
OwnerList |
checkRights() |
checkRights('organisation') oder nur Login-Prüfung? |
OwnerUpdate |
checkRights() |
checkRights('organisation') oder nur Login-Prüfung? |
ScopeCalldisplayImageDataDelete |
checkRights('scope') |
keine Änderung |
ScopeCalldisplayImageDataUpdate |
checkRights('scope') |
keine Änderung |
ScopeDelete |
checkRights('scope') |
keine Änderung |
ScopeGet |
checkRights() |
checkRights('scope') oder nur Login-Prüfung? |
ScopeList |
checkRights('scope') |
checkRights('restrictedscope') |
ScopePreferedByCluster |
checkRights() |
checkRights('scope') oder nur Login-Prüfung? |
ScopeUpdate |
checkRights('scope') |
keine Änderung |
Akzeptanzkriterien
- Rechteprüfung in den Controllern wurde entsprechend der Hintergrundinformationen angepasst
- Nutzer*innen mit der Rolle "Terminadministration" können die Gesamtübersicht aufrufen und Öffnungszeiten anlegen/bearbeiten/löschen
- Nutzer*innen mit der Rolle "Technische Administration" können die Seite "Behörden und Standorte" sowie alle darunter befindlichen Seiten (Referat, Behörde, Cluster, Standort, Öffnungszeiten) wie gewohnt bedienen und Veränderungen vornehmen: Referat, Behörde, Cluster, Standort und Öffnungszeit anlegen/bearbeiten/löschen
- Nutzer*innen mit der Rolle "Sachbearbeitung Plus" (
agent_queue_plus) können die Seite "Gesamtübersicht" öffnen und Daten abrufen
ZMSKVR-1295 – Umstellung Rechteprüfung – Freie Tage, Mandanten, Mailtemplates, Benachrichtigungen, Wartenummern und Systemkonfiguration
User Story
Als Systemadministrator*in
möchte ich, dass die Rechteprüfung in den Bereichen Freie Tage, Mandanten, Mailtemplates, Benachrichtigungen und Systemkonfiguration auf die neuen atomaren Berechtigungen umgestellt wird,
damit die schrittweise Ablösung des alten Berechtigungsmodells voranschreitet.
Hintergrundinformationen
Controller:
| Controller | Aktuell | Neu |
|---|---|---|
ConfigGet |
checkRights('basic') |
Zu klären: checkRights('config') oder checkRights('counter') |
ConfigUpdate |
checkRights('superuser') |
checkRights('config') |
DayoffList |
checkRights('superuser') |
checkRights('dayoff') |
DayoffUpdate |
checkRights('superuser') |
checkRights('dayoff') |
MailAdd |
checkRights('basic') |
checkRights('appointment') |
MailCustomTemplatesGet |
checkRights('superuser') |
checkRights('mailtemplates') |
MailDelete |
checkRights('superuser') |
keine Änderung |
MailGet |
checkRights('superuser') |
keine Änderung |
MailList |
checkRights('superuser') |
keine Änderung |
MailTemplatesCreateCustomization |
checkRights('superuser') |
checkRights('mailtemplates') |
MailTemplatesDelete |
checkRights('superuser') |
checkRights('mailtemplates') |
MailTemplatesGet |
checkRights('superuser') |
checkRights('mailtemplates') |
MailTemplatesPreview |
checkRights('superuser') |
checkRights('mailtemplates') |
MailTemplatesUpdate |
checkRights('superuser') |
checkRights('mailtemplates') |
NotificationAdd |
checkRights('sms') |
checkRights('appointment') |
NotificationDelete |
checkRights('superuser') |
keine Änderung |
NotificationList |
checkRights('superuser') |
keine Änderung |
ProcessAddLog |
checkRights('superuser') |
keine Änderung |
SourceUpdate |
checkRights('useraccount') |
checkRights('source') |
TicketprinterListByScopeList |
checkRights() |
checkRights('ticketprinter') oder nur Login-Prüfung? |
Akzeptanzkriterien
- Rechteprüfung in den Controllern wurde entsprechend der Hintergrundinformationen angepasst
- Nutzer*innen mit der Rolle "Terminadministration" können die Gesamtübersicht aufrufen und Öffnungszeiten anlegen/bearbeiten/löschen
- Keine Rolle außer "Technische Administration" darf:
- Mailtemplates anlegen/bearbeiten/löschen
- Freie Tage anlegen/bearbeiten/löschen
- Mandanten anlegen/bearbeiten/löschen
- Konfiguration auf den Seiten "Wartenummern" und "Wartenummernausgabe am Kiosk" anpassen
- Systemkonfiguration bearbeiten
ZMSKVR-1296 – Umstellung Rechteprüfung – Sachbearbeitung, Tresen und Warteschlangen
User Story
Als Systemadministrator*in
möchte ich, dass die Rechteprüfung im Bereich Sachbearbeitung und Warteschlange auf die neuen atomaren Berechtigungen umgestellt wird,
damit die schrittweise Ablösung des alten Berechtigungsmodells voranschreitet.
Hintergrundinformationen
Controller:
| Controller | Aktuell | Neu |
|---|---|---|
AppointmentUpdate |
checkRights() |
checkRights('appointment') oder nur Login-Prüfung? |
CalendarGet |
checkRights() |
checkRights('counter') oder nur Login-Prüfung? |
ClusterByScopeId |
checkRights('basic') |
checkRights('counter') |
ClusterGet |
checkRights('basic') |
checkRights('counter') |
ClusterQueue |
checkRights('basic') |
checkRights('waitingqueue') |
ClusterWithWorkstationCount |
checkRights() |
checkRights('counter') oder nur Login-Prüfung? |
CounterGhostWorkstation |
checkRights('basic') |
checkRights('counter') |
DepartmentByScopeId |
checkRights('basic') |
checkRights('counter') |
DepartmentGet |
checkRights('basic') |
checkRights('counter') |
DepartmentList |
checkRights('basic') |
checkRights('counter') |
OrganisationByCluster |
checkRights('basic') |
checkRights('counter') |
OrganisationByDepartment |
checkRights('basic') |
checkRights('counter') |
OrganisationByScope |
checkRights('basic') |
checkRights('counter') |
OrganisationList |
checkRights('basic') |
checkRights('counter') |
OwnerByOrganisation |
checkRights('basic') |
checkRights('counter') |
ProcessDeleteQuick |
checkRights('basic') |
checkRights('appointment') |
ProcessFinished |
checkRights() |
checkRights('appointment') oder nur Login-Prüfung? |
ProcessFree |
checkRights() |
checkRights('appointment') oder nur Login-Prüfung? |
ProcessFreeUnique |
checkRights() |
checkRights('appointment') oder nur Login-Prüfung? |
ProcessListByClusterAndDate |
checkRights('basic') |
checkRights('appointment') |
ProcessListByExternalUserId |
checkRights() |
checkRights('appointment') oder nur Login-Prüfung? |
ProcessListByScopeAndDate |
checkRights('basic') |
checkRights('appointment') |
ProcessListByScopeAndStatus |
checkRights() |
checkRights('appointment') oder nur Login-Prüfung? |
ProcessNextByCluster |
checkRights() |
checkRights('cherrypick') oder checkRights('appointment') oder nur Login-Prüfung? |
ProcessNextByScope |
checkRights() |
checkRights('cherrypick') oder checkRights('appointment') oder nur Login-Prüfung? |
ProcessQueued |
checkRights() |
checkRights('appointment') oder nur Login-Prüfung? |
ProcessRedirect |
checkRights() |
checkRights('appointment') oder nur Login-Prüfung? |
ProcessReserve |
checkRights() |
checkRights('appointment') oder nur Login-Prüfung? |
ProcessReservedList |
checkRights('basic') |
checkRights('appointment') |
ProcessSearch |
checkRights() |
checkRights('customersearch') oder nur Login-Prüfung? |
ScopeEmergency |
checkRights() |
checkRights('emergency') oder nur Login-Prüfung? |
ScopeEmergencyRespond |
checkRights() |
checkRights('emergency') oder nur Login-Prüfung? |
ScopeEmergencyStop |
checkRights() |
checkRights('emergency') oder nur Login-Prüfung? |
ScopeListByCluster |
checkRights() |
checkRights('counter') oder nur Login-Prüfung? |
ScopeQueue |
checkRights('basic') |
checkRights('waitingqueue') |
ScopeWithWorkstationCount |
checkRights('basic') |
checkRights('counter') |
UserQueue |
checkRights('basic') |
checkRights('waitingqueue') |
WorkstationDelete |
checkRights() |
checkRights('appointment') oder nur Login-Prüfung? |
WorkstationGet |
checkRights() |
checkRights('appointment') oder nur Login-Prüfung? |
WorkstationPassword |
checkRights() |
checkRights('appointment') oder nur Login-Prüfung? |
WorkstationProcess |
checkRights() |
checkRights('appointment') oder nur Login-Prüfung? |
WorkstationProcessDelete |
checkRights() |
checkRights('appointment') oder nur Login-Prüfung? |
WorkstationProcessGet |
checkRights() |
checkRights('appointment') oder nur Login-Prüfung? |
WorkstationProcessParked |
checkRights() |
checkRights('appointment') oder nur Login-Prüfung? |
WorkstationProcessWaitingnumber |
checkRights() |
checkRights('appointment') oder nur Login-Prüfung? |
WorkstationUpdate |
checkRights() |
checkRights('appointment') oder nur Login-Prüfung? |
Templates (optional)
Aktuell gibt es in den Twig-Templates für die Sachbearbeiter-/Tresenansicht keine explizite Rechteabfrage. Um die verschiedenen Warteschlangen für bestimmte Sachbearbeiter-Rollen auszublenden, muss zmsadmin/templates/block/queue/table.twig angepasst werden:
| Schlange | Benötigte Permission |
|---|---|
| Geparkte Termine | permission.parkedqueue |
| Offene Aufrufe / In Bearbeitung | permission.openqueue |
| Warteschlange | permission.waitingqueue |
| Verpasste Termine | permission.missedqueue |
| Abgeschlossene Termine | permission.finishedqueue |
Akzeptanzkriterien
- Rechteprüfung in den Controllern wurde entsprechend der Hintergrundinformationen angepasst
- Nutzer*innen mit der Rolle "Sachbearbeitung beschränkt" (
agent_basic) können keine einzige Schlange sehen - Nutzer*innen mit der Rolle "Sachbearbeitung" (
agent_queue) können alle Schlangen sehen - Nutzer*innen mit den Rollen "Sachbearbeitung beschränkt", "Sachbearbeitung" oder "Sachbearbeitung Plus" können:
- den Notruf aktivieren/zur Hilfe kommen/beenden
- Termine anlegen/aktualisieren/aufrufen/bearbeiten/abschließen/löschen/etc.
ZMSKVR-1173 – Entfernung der Legacy-Berechtigungsstrukturen
User Story
Als Entwickler*in
möchte ich, dass die veralteten Berechtigungsstrukturen aus dem Code und der Datenbank entfernt werden,
damit der Code wartbar bleibt, keine Verwirrung durch Parallelstrukturen entsteht und technische Schulden abgebaut werden.
Hintergrundinformationen
Nach erfolgreicher Umstellung auf das neue atomare Berechtigungsmodell und Abschluss der Frontend-Migration existieren im System weiterhin Legacy-Strukturen, die nur noch für die Abwärtskompatibilität benötigt wurden:
| Komponente | Legacy-Struktur |
|---|---|
| Datenbank | Feld „Berechtigung" in nutzer-Tabelle |
| Entity | Berechnete alte Rechte (basic, scope, sms, etc.) in rights-Struktur |
| Helper | Klasse RightsLevelManager |
| Schema | Alte Rechte-Namen in useraccount.json |
Vorbedingungen für diese Story:
- Die Backend-Umstellung auf das atomare Berechtigungsmodell ist abgeschlossen
- Alle Frontend-Templates verwenden die neuen atomaren Berechtigungen
- Alle Tests sind auf die neuen Rechte angepasst
Akzeptanzkriterien
- Das Feld „Berechtigung" wurde per Migration aus der
nutzer-Tabelle entfernt - Die Berechnung der alten Rechte-Namen in
getEntityMapping()wurde entfernt - Die Methode
reverseEntityMapping()schreibt keine Werte mehr in das Feld Berechtigung - Alle Referenzen auf das Feld Berechtigung in SQL-Queries wurden entfernt
- Die Klasse
Helper/RightsLevelManager.phpwurde vollständig entfernt - Alle Aufrufe von
RightsLevelManager::getLevel()undRightsLevelManager::$possibleRightswurden entfernt - Die
rights-Struktur enthält nur noch die neuen atomaren Berechtigungen - Die alten Rechte-Namen (
basic,scope,sms,audit,clusterals berechneter Wert) wurden aus derrights-Struktur entfernt - Die Methode
getDefaults()enthält nur noch die neuen atomaren Berechtigungen