Benutzer der Session
Wertauflöser - Kurzfassung
Zweck: Gibt die "Benutzerdaten" (Benutzerkonto/Gastbenutzerkonto) für den anwendbaren Anmeldekontext zurück.
Der Benutzer der Session-Wertauflöser gibt die "Benutzerdaten" (das Konto) für den anwendbaren Anmeldekontext zurück.
Dabei sind Laufzeit folgende Szenarien zu unterscheiden:
Laufzeit-Szenario |
Rückgabewert von "Benutzer der Session" |
Ein vollwertiger Benutzer (s. Benutzer) ist für die aktuelle Sitzung eingeloggt bzw. wurde per Login API zur Authentifizierung angegeben und gilt im anwendbaren Anmeldekontext als "Benutzer". |
Daten des Benutzerkontos (Typ: Benutzer), das die Sitzung oder den Zugriff per Login API authentifiziert |
Ein Gastbenutzer (s. Gastbenutzer) ist für die aktuelle Sitzung eingeloggt bzw. wurde per Login API zur Authentifizierung angegeben und gilt im anwendbaren Anmeldekontext als "Benutzer". |
Daten des Gastbenutzerkontos (Typ: Gastbenutzer), das die Sitzung oder den Zugriff per Login API authentifiziert |
Im unmittelbaren oder mittelbaren Ausführungskontext des Wertauflösers spezifiziert eine Ausführen als-Ereignisaktion einen "Benutzer", um den anwendbaren Anmeldekontext temporär abweichend vom tatsächlich angemeldeten Benutzer oder Gastbenutzer zu definieren. |
Daten des Benutzerkontos (Typ: Benutzer), das im temporären Anmeldekontext als "Benutzer" definiert ist. |
►WARNUNG◄ Rückgabewert nicht für Schreibzugriffe verwenden!
Der Rückgabewert des Benutzer der Session-Wertauflösers liefert immer nur einen "Klon" des Kontos aus dem anwendbaren Anmeldekontext, der möglicherweise nicht mehr dem serverseitigen Datenstand für das betreffende Konto entspricht. Wenn ein Benutzer oder Gastbenutzer sich zu einer Lobster Data Platform / Orchestration-Sitzung anmeldet, wird dieser Klon als "Schnappschuss" von den Daten des verwendeten Kontos erstellt, damit dessen Daten während der Sitzung nicht immer wieder vom Server abgerufen werden müssen. Nur wenn der angemeldete Benutzer selbst Änderungen am eigenen Konto speichert (z. B. auch durch Funktionen wie Sprache ändern, Profilbild ändern, usw.) wird der nur für seine Sitzung gültige Klon des Kontos neu erstellt.
Der Versuch, am geklonten Rückgabewert des Benutzer der Session-Wertauflösers vorgenommene Änderungen - z. B. per Änderungen später speichern - zu speichern, scheitert (mit Fehlermeldung inkl. Rollback für die Transaktion), wenn der serverseitige Datenstand nach dem Erstellen des verwendeten Klons durch Zugriffe aus anderen Sitzungen aktualisiert wurde. Um das Risiko für einen Konflikt beim Schreiben zu minimieren, sollten die Daten des betreffende Kontos möglichst unmittelbar vor einem Schreibzugriff vom Server abgeholt werden. Dazu kann die "ID" (id) des als Benutzer der Session identifizierten Kontos an den Eingabeobjekt (Typsicher)-Wertauflöser übergeben werden (s. Beispiel "Schreibzugriff" unten).
Da der Wertauflöser wahlweise die Daten eines Benutzerkontos oder eines Gastbenutzerkontos liefert, deklariert das GUI für die Konfiguration den Typ "Schnittstelle > Benutzer" für den Rückgabewert des Wertauflösers. Ein Objekt-Feld-Wertauflöser bietet für diesen Schnittstellen-Typ nur die folgende minimalistische Auswahl von Feldern an, die für eine Authentifizierung mit dem einen oder anderen Kontotyp unbedingt benötigt werden:
Feldname |
Lokalisierung |
Datentyp |
Bedeutung |
Details |
id |
ID |
Long |
Absolutwert identifiziert das Konto des "Benutzers" |
Für Benutzer wird der ID-Wert als positiver Long-Wert angegeben. |
created |
Erstellt |
Timestamp |
Erstelldatum des Kontos |
|
creatorId |
Erstellt von |
Long |
Absolutwert identifiziert das "Benutzer"-Konto, der das zurückgegebene Konto erstellt hat. |
Für Benutzer wird der ID-Wert als positiver Long-Wert angegeben. |
ownerId |
Besitzer |
Long |
ID des Firmenkontos, das das Konto des "Benutzers" besitzt |
Der Wert -1 signalisiert, dass kein Besitzer zugeordnet ist. |
Unabhängig von der Definition des Typs "Schnittstelle > Benutzer" umfasst der Rückgabewert aber immer sämtliche Daten des Kontos, das als Benutzer der Session gilt.
►WICHTIG◄ Die "Schnittstelle > Benutzer" liefert bei einem clientseitigen Lesezugriff auf das Feld username den Wert des Felds loginToken, falls ein Gastbenutzer als Benutzer der Session gilt. Details zu dieser Besonderheit verdeutlicht das Beispiel "Komplexerer Anwendungsfall" unten.
►HINWEIS◄ Wenn man den Benutzer der Session-Wertauflöser in einer Konfiguration einsetzt, sollte die implementierte Logik so angelegt werden, dass jedes der eingangs aufgelisteten Szenarien vorkommen könnte. Auch wenn auf einem Lobster Data Platform / Orchestration-System bisher Gastbenutzer keine Rolle spielen oder im unmittelbaren Kontext keine Ausführen als-Ereignisaktion verwendet wird, sollte die Möglichkeit in Betracht gezogen werden, dass sich die Einsatzbedingungen in Zukunft ändern. Eine Konfiguration, in deren Kontext bisher z, B. ausschließlich Benutzer als Benutzer der Session zu erwarten sind, sollte durch geeignete Vorkehrungen sicherstellen, dass auch in einer Gastbenutzer-Sitzung wirklich "nichts passieren" kann. Es sollte allerdings auch kein wesentlicher Schritt eines Workflow mit einem Rollback scheitern oder - eventuell noch schlimmer - mit unvollständigen oder unpassenden Daten ausgeführt werden, nur weil der Benutzer der Session vom falschen Typ (Gastbenutzer vs. Benutzer) ist oder durch eine Ausführen als-Ereignisaktion innerhalb einer komplexen Aufrufkette ein "unerwartetes" Benutzerkonto ins Spiel gebracht hat.
Konfiguration
Der Wertauflöser ignoriert den Eingabewert und verwendet keine Parameter.
Beispiele
Beispiel: Einschränkung für eine Eigene Übersicht
Den Zugriff auf die meisten Entitätstypen regelt Lobster Data Platform / Orchestration über den "Besitz" (ownerId) bzw. Firmenfreigaben, so dass meistens die Firma der Session ausschlaggebend dafür ist, welche Entitäten Eigene Übersichten in ihrem Datengrid auflisten. Man könnte sagen, dass Lobster Data Platform / Orchestration keinen "Privatbesitz" an Entitäten vorsieht, weil systematisch nur Firmen als Besitzer oder Empfänger einer Freigabe vorgesehen sind. Allerdings verweisen die automatisch befüllten Standardfelder "Erstellt von" (creatorId) und "Zuletzt geändert von ID" (lastModifierId) einer Entität auf Benutzer bzw. Gastbenutzer. Im folgenden Beispiel soll eine "Eigene Übersicht" für Benutzer auf dieser Basis eine zusätzliche Einschränkung erhalten, so dass sie nur diejenigen Benutzer ausgibt, für die der angemeldete Benutzer der Session als "Ersteller" gilt.
Konfiguration:
Eine "Eigene Übersicht" für Benutzer wird neu angelegt und mit der rechts abgebildeten Konfiguration für die Einschränkung versehen:
►HINWEIS◄ Die Schnittstelle gibt den eigentlich positiven Wert der ID eines Gastbenutzerkontos als negativen Wert zurück. Allerdings greift dieselbe Logik auch für den Wert für "Erstellt von". Insofern funktioniert die Eigene Übersicht mit dieser Einschränkung auch ohne besondere Vorkehrungen für eine Anmeldung als Gastbenutzer. ►ANMERKUNG◄ Dass ein Gastbenutzer Konten für Benutzer erstellen kann, sollte normalerweise durch die Zuweisung einer geeignet eingeschränkten Rolle ausgeschlossen sein. Allerdings ist die Einschränkung in dieser Form für beliebige Entitäten einsetzbar. |
|
Laufzeitbeispiel:
Die Eigene Übersicht "Von ►MIR◄ erstellte Benutzerkonten" listet für den Benutzer "Triple Q" nur die beiden Benutzerkonten auf, die er selbst erstellt hat.
Die Spalte Erstellt von zeigt - gemäß der für die Übersicht geltenden Einschränkung (s. o.) - in allen Zeilen den Benutzernamen (username) und die ID von "Triple Q", wenn dieser der Benutzer der Session ist.
Beispiel: Schreibzugriff auf das als Benutzer der Session identifizierte Konto
Um das Risiko missbräuchlicher Zugriffe auf Daten in Lobster Data Platform / Orchestration zu minimieren, sollen Gastbenutzer per Klick auf einen Ribbon-Button das eigene Konto deaktivieren können.
Laufzeitbeispiel:
Konfiguration:
Der Ribbon-Button (s. o.) löst ein Eigenes Aktionsevent "Mein Konto deaktivieren" aus, das als Auslösendes Ereignis für die rechts abgebildete Ereignisbehandlung gelistet ist. Die Prüfende Regel soll hier ausdrücklich absichern, dass die unten gezeigte Ereignisaktionen nur ausgeführt werden, wenn als Benutzer der Session ein Gastbenutzer vorliegt. Da der Ribbon-Button in unterschiedlichen Kontexten angeboten werden und nicht an die Auswahl eines bestimmten Bezugsobjekts gebunden werden soll, ist kein Eingabewert für das Ereignis zu erwarten. Insofern wäre eine direkte Typprüfung auf den Typ "Gastbenutzer" für den Eingabewert sinnlos. Stattdessen wird die Typprüfung hier innerhalb einer Mit-Regel ausgeführt, für die der Benutzer der Session-Wertauflöser im Parameter Objekt Feld Resolver das Bezugsobjekt temporär verändert. Auch wenn für dessen Rückgabewert formal der Typ "Schnittstelle > Benutzer" ausgewiesen wird (s. Bild) , liegt zur Laufzeit ein "Gastbenutzer"-Objekt vor, wenn Gastbenutzer angemeldet sind. ►ANMERKUNG◄ Im Unterschied zu einer direkten Typprüfung für den Eingabewert einer Ereignisbehandlung wird der in der Mit-Regel geprüfte Typ nicht als Kontext für die Aktion bei bestandener Regel angenommen. Stattdessen gilt der Kontext hier als unbestimmt ("Objekt"). |
|
Als Aktion bei bestandener Regel muss zunächst durch eine Ausführen als-Ereignisaktion ein Anmeldekontext mit geeigneten Zugriffsrechten (s. Als Rolle) hergestellt werden, da davon auszugehen ist, dass ein Gastbenutzer nicht berechtigt ist, Gastbenutzerkonten zu ändern.
|
|
►WICHTIG◄ Die Verkettung im Objekt Resolver der Ausführen mit-Ereignisaktion könnte man erheblich verkürzen, in dem man nur die erste und letzte "Stufe" verwendet:
Benutzer der Session > Eingabeobjekt (Typsicher) mit Typ "Gastbenutzer"
Allerdings sollte man das unbedingt unterlassen, weil sonst die Ereignisaktionen mit dem bei der Anmeldung des Gastbenutzers "geklonten" Datenstand des Kontos ausgeführt werden, was in Verbindung mit Änderungen später speichern zu einem Fehler mit Rollback führen kann, wenn seitdem das Konto ausgehend von einer anderen Sitzung verändert wurde, so dass der Klon für den Server als "veraltet" gilt (s. "WARNUNG" in der Einleitung).
Beispiel: Komplexerer Anwendungsfall
In ausgewählten Kontexten soll über ein Ribbonmakro ein "Hinweis" (per E-Mail) an andere Benutzer/Gastbenutzer versendet werden können, der sich auf die aktuelle Auswahl bezieht.
Beim Klick auf den betreffenden Button soll der angemeldete Benutzer über ein Kontextmenü einen der folgenden Adressaten für den Hinweis auswählen können:
sein eigenes Konto (Benutzer der Session)
das Konto mit dem der Benutzer der Session erstellt wurde (creatorId)
das Konto mit dem der Benutzer der Session zuletzt geändert wurde (lastModifierId)
Die Auswahlliste soll dabei kein Konto mehrfach aufführen, auch wenn es in unterschiedlichen Funktionen relevant ist.
Die Lösung muss so aufgebaut werden, dass die beteiligten Konten wahlweise Benutzer oder Gastbenutzer sein können.
Laufzeitbeispiel:
Der Screenshot zeigt den Ribbon-Button "Hinweis" über den das angezeigte Kontextmenü geöffnet wurde.
Das Kontextmenü zeigt zwei Adressaten für einen Hinweis zur Auswahl an.
Konfiguration:
Nachfolgend wird nur die Konfiguration beschrieben, die das Öffnen des Kontextmenüs betrifft. Die auszulösende Benachrichtigung erwartet vom Kontextmenü das komplette Datenobjekt für das ausgewählte Benutzer- oder Gastbenutzerkonto in einer Variable.
Der dynamische Aufbau des Kontextmenüs erfolgt ausgehend von den Daten des Benutzer der Session (s. Parameter Objekt Resolver in der Ausführen mit-Ereignisaktion) in den rechts zunächst im Überblick dargestellten Schritten, die unterhalb im Detail beschrieben werden:
|
|
Für den ersten Schritt wird eine Setze Wert-Ereignisaktion wie rechts abgebildet konfiguriert, um der Variablen accountIds (linke Seite der Zuweisung) die Liste der relevanten Konto-Referenzen zuzuweisen. Auf der rechten Seite der Zuweisung wird die Liste durch eine Verkettung der folgenden Wertauflöser definiert:
Die Variable accountIds enthält zur Laufzeit aufgrund dieser Konfiguration eine Liste mit mindestens einem und maximal drei unterschiedlichen Long-Werten, die auf je ein Benutzer- oder Gastbenutzerkonto verweisen. Positive Long-Werte verweisen dabei auf Benutzer und negative Werte auf Gastbenutzer. |
|
Für den zweiten Schritt wird innerhalb einer geeignet parametrierten Ausführen als-Ereignisaktion zunächst ein geeigneter Anmeldekontext hergestellt, damit ausreichender Zugriff auf die Konten besteht, die gelesen werden sollen. Im Beispiel (im Bild nicht zu sehen) wird die Rolle "Super user" beansprucht. Damit besteht unabhängig von der Auswahl einer bestimmten "Firma" Vollzugriff auf alle Konten. Der Abruf der Konten für das Kontextmenü per Suche (Ereignisaktion) muss in zwei Schritten erfolgen, da jeweils nur ein bestimmter Entitätstyp (Benutzer oder Gastbenutzer) vom Server abgefragt werden kann. Das Bild rechts zeigt die Konfiguration für die Suche (Ereignisaktion) für die Entität Benutzer:
Zur Laufzeit enthält die Variable users nach dem Ausführen der Suche (Ereignisaktion) eine Liste von Entitäten des Typs Benutzer, die auch leer sein kann, falls die Variable accountIds ausschließlich negative Werte enthält, die auf Gastbenutzer verweisen. ►HINWEIS◄ Die Suche (Ereignisaktion) "findet" nur Benutzer, die im anwendbaren Anmeldekontext auch gelesen werden können. Dieser hängt hier von der Parametrierung der umgebenden Ausführen als Ereignisaktion ab. Wird diese unpassend gewählt, "fehlen" ggf. relevante Benutzer als Adressaten im Kontextmenü. |
|
Eine zweite Suche (Ereignisaktion), die die Entität Gastbenutzer betrifft definiert wiederum den Modus "Suchwert" und eine Suche vom Typ "Suche". Das Ergebnis ist eine Liste von Gastbenutzer-Konten, die in die Variable guests (nicht im Bild) geschrieben werden soll. Die Bedingung für diese Suche (Ereignisaktion) verwendet die rechts dargestellte Konfiguration. Diese erfolgt analog zur Bedingung für die Benutzer (s. oben) mit den folgenden wichtigen Unterschieden:
Zur Laufzeit enthält die Variable guests nach dem Ausführen der Suche (Ereignisaktion) eine Liste von Entitäten des Typs Gastbenutzer, die auch leer sein kann, falls die Variable accountIds ausschließlich positive Werte enthält, die auf Benutzer verweisen. ►HINWEIS◄ Die Suche (Ereignisaktion) "findet" nur Gastbenutzer, die im anwendbaren Anmeldekontext auch gelesen werden können. Dieser hängt hier von der Parametrierung der umgebenden Ausführen als Ereignisaktion ab. Wird diese unpassend gewählt, "fehlen" ggf. relevante Gastbenutzer als Adressaten im Kontextmenü. |
|
Der dritte Schritt soll die in den Variablen users und guests gesammelten Konten zusammenführen und eine vereinigte Liste für Benutzer und Gastbenutzer zurückgeben. Da diese Liste von Konten direkt die Auswahloptionen für das zu öffnende Kontextmenü definieren soll, kann diese Aufbereitung direkt in der Öffne Kontextmenü-Ereignisaktion untergebracht werden:
|
|
Aufgrund der bisherigen Konfiguration erscheinen im Kontextmenü die Benutzer immer oberhalb der Gastbenutzer und jeweils in der Reihenfolge, in der sie von der zugehörigen Suche (Ereignisaktion) zurückgegeben werden.
Auch wenn der Reihenfolge bei maximal drei Einträgen keine große Bedeutung zukommt, soll deren Effekt hier demonstriert werden:
An die bestehende Verkettung für den Parameter Elemente innerhalb der Öffne Kontextmenü-Ereignisaktion wird ein Liste sortieren-Wertauflöser angehängt, der das Feld username als Vergleichswert definiert.
Laufzeitbeispiel:
Allerdings trügt der Schein, wie eine weitere Stichprobe im Kontext eines anderen Gastbenutzers belegt:
|
|
Wie im letzten "Laufzeitbeispiel" (oben) zu sehen, greift die Sortierung zwischen mehreren Gastbenutzer-Einträgen im Kontextmenü mit der bisherigen Konfiguration nicht. Der mit der Ziffer "6" beginnende Eintrag müsste sonst an Position 2 erscheinen. Der Hintergrund:
Die Konfiguration kann - z. B. wie rechts gezeigt - angepasst werden, um dieses Problem zu neutralisieren:
|
|
►ANMERKUNG◄ Falls das Kontextmenü nicht über eine Ereignisbehandlung sondern per Client Workflow aufgebaut wird, greift die Fallback-Regelung für den username auch beim Liste sortieren, so dass auf die zuletzt hinzugefügte Textverkettung verzichtet werden kann. Allerdings steht in einem Client Workflow die Ausführen als-Ereignisaktion nicht zur Verfügung, so dass für die Suche nach den Konten (im zweiten Schritt) ausreichende Leseberechtigungen im für den Client Workflow anwendbaren Anmeldekontext gewährleistet sein müssen.