enhancement
major
minor
major
minor
major
#29916
Rollenprofile: Leserecht eines Dialogs wird auf die öffnende Komponente übertragen
Problem
In der Sicht Administration > Berechtigungen > Rollenprofile wirkt sich das Leserecht an einem Dialog mit eigener Sicherheitskonfiguration (with-security-configuration="true") auf die Komponente aus, an der der Dialog definiert ist:
- Gibt man einer Rolle ein Recht an einem Tab innerhalb des Dialogs, erhält die Rolle automatisch auch das Leserecht an der öffnenden Komponente.
- Entzieht man das Recht im Dialog wieder, wird der öffnenden Komponente das Leserecht entzogen, auch wenn es dort ausdrücklich gesetzt war.
Damit vergibt die Sicht mehr Rechte als konfiguriert, ohne dass dies sichtbar wird. Gerade bei Dialogen, die per Goto direkt erreichbar sind, ist das Leserecht am Öffner nicht erforderlich. Beim Entziehen gehen ausdrücklich gesetzte Rechte verloren.
Ursache
ApplyRolesCommandHandler.ensureRead() überträgt nach dem Speichern das Leserecht von einem Knoten an alle Vorfahren im Sicherheitsbaum bzw. entzieht es ihnen wieder. Für verschachtelte Tabs ist das gewollt: Ein Unter-Tab ist nur erreichbar, wenn der umgebende Tab sichtbar ist. Im Sicherheitsbaum hängt ein Dialog jedoch als Kind unter der Komponente, an der er definiert ist (LayoutConfigTreeNode), und wird deshalb wie ein Unter-Tab behandelt.
Lösung
Die Übertragung endet an der Wurzel eines Dialogs mit eigener Sicherheitskonfiguration. Die Wurzel ist der oberste Knoten des Dialogs: Sein getDialogParent() ist zugleich sein Elternknoten im Layout-Baum.
- Innerhalb des Dialogs bleibt das Verhalten unverändert. Der Dialog selbst hat keine eigene Checkbox. Er erhält sein Leserecht weiterhin aus seinen Tabs, damit er geöffnet werden kann.
- Die öffnende Komponente und ihre Vorfahren werden nicht mehr verändert. Beim Entziehen hält ein Recht im Dialog das Leserecht am Öffner nicht mehr fest.
- Dialoge ohne eigene Sicherheitskonfiguration verwenden die Rechte des Öffners. Ihre Tabs übertragen das Leserecht weiterhin auf den Öffner.
Außerdem wird in ensureRead() die Variable hasAnyRight nicht pro Rolle zurückgesetzt. Hat ein Knoten keine Command-Groups, wird so der Wert der vorherigen Rolle übernommen. Das wird mit behoben.