enhancement
major
minor
defect
critical
major
minor
major
#30025
React-Oberfläche: Befehle und Einheiten ausblenden, für die der angemeldete Benutzer auf keinem Objekt die nötige Rolle hat
Kontext
Seit #29856 entscheidet ModelAccessPolicy (isOffered), ob ein Befehl oder eine Einheit der React-Oberfläche ausgeblendet oder nur deaktiviert wird. Ausgeblendet ist heute nur, was kein Benutzer je dürfen kann: keiner Rolle ist die Operation auf dem Typ (oder einer Spezialisierung, bzw. auf den Typen des Zugriffs-Parents) erteilt. Der angemeldete Benutzer spielt für diese Entscheidung keine Rolle.
Dadurch sieht ein Benutzer mit geringen Rechten alle Befehle, die irgendein anderer Benutzer ausführen könnte – deaktiviert, mit Begründung als Tooltip. Ein Benutzer, der eine Funktion auf keinem einzigen Objekt ausführen kann, sollte sie gar nicht sehen.
Gewünschtes Verhalten
Ein Befehl / eine Einheit wird ausgeblendet, wenn der angemeldete Benutzer die Operation auf keinem Objekt des Typs ausführen kann: Er hält keine der Rollen, denen die Operation auf dem Typ erteilt ist, auf irgendeinem Objekt (direkt, über Gruppen, über Rollenregeln). Hält er eine solche Rolle auf mindestens einem Objekt, bleibt der Befehl sichtbar und wird am konkreten Objekt wie bisher freigegeben oder mit Begründung deaktiviert.
Die Prüfung darf nie etwas ausblenden, das der Benutzer auf einem Objekt tatsächlich darf (Überschätzung der Rechte ist zulässig, Unterschätzung nicht).
Lösung
- AccessManager.hasRoleOnAnyObject(Person, Collection<? extends BoundRole>): ob eine Person eine der Rollen auf irgendeinem Objekt hält. Keine Person oder keine Rollen → false, Administrator → true; der AccessManager selbst antwortet konservativ true. Die Antwort ist nie enger als hasRole an einem Objekt.
- StorageAccessManager beantwortet die Frage mit einer Existenzabfrage auf der Rollentabelle (SecurityStorage.hasRoleOnAnyObject mit den Gruppen der Person) – derselben Tabelle, die hasRole liest (Objekt und Security-Parents); eine geerbte Rolle steht dort am Vorfahren. Während eines Rebuilds der Tabelle und bei einem Lesefehler lautet die Antwort true.
- Die Antworten werden je Interaktion, Person und Rollenmenge zwischengespeichert und mit jeder neuen Revision der Wissensbasis verworfen; mit offenen Änderungen in der eigenen Transaktion wird nicht zwischengespeichert. Dafür ist der Mechanismus von RoleAssignmentMemo als allgemeine Klasse InteractionRevisionMemo herausgezogen, die beide nutzen. Eine neu erhaltene Rolle oder Gruppenmitgliedschaft wirkt damit noch in derselben Interaktion.
- ModelAccessPolicy: Alle Entscheidungen "Operation ist keiner Rolle erteilt" (isOffered, Ausblenden statt Deaktivieren an Objekt, Attribut, Attribut eines Typs, Entwurfs-Attribut und beim Anlegen) betrachten nur noch die erteilten Rollen, die der angemeldete Benutzer auf irgendeinem Objekt hält. Zugriffs-Parents wie in #30024.
- React-Demo (tl-demo-react): Ein Konto, das Mitglied von P1, aber nirgends Projekt-Administrator ist, sieht das Löschen von P1 nicht mehr (ausgeblendet statt deaktiviert), "Freigegeben" eines Meilensteins nur lesend; ein Konto, das ein anderes Projekt administriert, sieht beides deaktiviert. Die Beschreibung des Szenarios in demoReactConf.config.xml ist entsprechend angepasst.
Ein Befehl, der auf seinem Eingabekanal arbeitet (z.B. <delete-object/>), kennt ohne Objekt im Kanal keinen Typ und wird bei leerem Kanal weiterhin deaktiviert statt ausgeblendet; das behandelt #30038 (optionaler Werttyp eines Kanals).