enhancement
major
minor
major
minor
major
#29917
Rollenprofil-Import: implizite Leserechte der umgebenden Sicherheits-Layouts ergänzen
Problem
Die security.xml wird auf zwei Wegen importiert, die sich unterschiedlich verhalten:
- beim Start durch den AccessConfigurationSetupService (AccessImporter), wenn sich die Datei geändert hat,
- in Administration > Berechtigungen > Rollenprofile durch RolesProfileHandler.
Beide übernehmen die Rechte Eintrag für Eintrag. Leserechte, die die Rollenprofil-Sicht beim Speichern aus den Kindern ableitet, werden nicht ergänzt. Fehlt in der Datei die Lesen-Zeile eines umgebenden Sicherheits-Layouts, entsteht nach dem Import ein Zustand, den die Rollenprofil-Sicht nie erzeugen würde: Die Rolle hat Rechte an einem Tab oder Dialog, kann ihn aber nicht erreichen, weil ihr das Leserecht am umgebenden Tab bzw. am Dialog fehlt. Das betrifft insbesondere Container ohne eigene Checkbox in der Rollenprofil-Sicht, z.B. Dialoge mit eigener Sicherheitskonfiguration. Solche Dateien entstehen z.B. durch Pflege von Hand oder aus älteren Versionen.
Weitere Unterschiede und Mängel:
- Befehlsgruppen, die an einer Sicht nicht konfiguriert sind, werden ohne Warnung gespeichert. Solche Rechte wirken nicht, erscheinen nicht in der Rollenprofil-Sicht und werden nicht exportiert.
- Eine unbekannte Befehlsgruppe bricht den Import in der Oberfläche ab, beim Start wird sie übersprungen.
- Der Import in der Oberfläche kennt nur Sichten aus dem Layout-Baum. Rechte an anderen Sicherheitsobjekten, z.B. den Sicherheitsbereichen der React-Sichten (SecurityScopeService), meldet er als fehlende Sichten und importiert sie nicht. Der Export schreibt sie nicht.
- Beim Start werden alle Rechte zurückgesetzt, beim Import in der Oberfläche nur die der Layout-Knoten.
Lösung
Ein gemeinsamer Importer
AccessImporter ist der einzige Importer. Der AccessConfigurationSetupService und RolesProfileHandler rufen ihn auf. Die nicht verwendete Klasse RolesProfileImporter wurde entfernt.
Der Import
- setzt alle Rechte zurück, die Datei ist vollständig,
- importiert Rechte an Sichten des Layout-Baums nur über die Sicht, die die Sicherheit festlegt, und nur für Befehlsgruppen, die an der Sicht konfiguriert sind,
- importiert Rechte an anderen Sicherheitsobjekten (z.B. Sicherheitsbereichen) direkt über den Namen,
- überspringt unbekannte Rollen, Sichten und Befehlsgruppen,
- ergänzt die impliziten Leserechte.
Beim Start werden dafür die Layout-Bäume aus der Layout-Ablage aufgebaut.
Implizite Leserechte
Nach dem Import werden für jede importierte Rolle die impliziten Leserechte ergänzt, nach derselben Regel wie beim Speichern in der Rollenprofil-Sicht:
- Jedes Sicherheits-Layout erhält das Leserecht, wenn eines seiner Kinder ein Recht für die Rolle hat.
- Die Übertragung endet an der Wurzel eines Dialogs mit eigener Sicherheitskonfiguration (siehe #29916).
- Es werden nur Rechte ergänzt, nie entfernt.
Die Regel liegt in der Klasse ImplicitReadRights, die Rollenprofil-Sicht (ApplyRolesCommandHandler) und Import gleichermaßen nutzen.
Export
Der Export schreibt weiterhin auch die abgeleiteten Leserechte. Damit lässt sich eine exportierte Datei auch in Versionen ohne diese Ergänzung vollständig importieren.
Neu schreibt er auch die Rechte an Sicherheitsobjekten, die keine Sicht des Layout-Baums sind, z.B. an Sicherheitsbereichen. So gehen sie beim vollständigen Zurücksetzen durch einen Import nicht verloren.
Meldungen
Der Import schreibt als Warnung ins Log, beim Import in der Oberfläche zusätzlich als Meldung an den Benutzer:
- nicht existierende Rollen und Sichten,
- unbekannte Befehlsgruppen,
- an der Sicht nicht konfigurierte Befehlsgruppen,
- ergänzte implizite Leserechte.
Beim Start wurden unbekannte Rollen, Sichten und Befehlsgruppen bisher als Fehler geloggt, jetzt als Warnung.