Um Masterportale entweder angepasst für viele Kunden oder angepasst über eine Authentifizierung zu betreiben, ist eine Serverkomponente notwendig, welche die Portalkonfiguration generiert.
Der Masterportal-Klientenkonfigurationsgenerator (masterportal-clientconfigs
) übernimmt diese Aufgabe im Masterportal-Stil;
das heißt: möglichst viele Aspekte der Portalgenerierung sind konfigurierbar.
Zum Starten der App müssen folgende Schritte durchgeführt werden
.env Datei mit folgendem Inhalt anlegen:
KEYCLOAK_ADDRESS="[URL-Keycloak]"
VARIANT_ONLY=0
Name | Beschreibung | Wert |
---|---|---|
KEYCLOAK_ADDRESS |
URL des Keycloaks | "http://[domain]/realms/local" |
VARIANT_ONLY |
Wenn auf 1 gesetzt, dann werden die Portale unter der rootURL erreichbar. | development |
Bibliotheken installieren:
npm install
App Starten:
npm start
In der Datei docker-compose.yaml muss in der Environment-Variable KEYCLOAK_ADDRESS ein Keycloak angebunden werden.
Das Docker-Image kann mit folgendem Kommando gebaut werden:
docker-compose build
Das Docker-Image kann mit folgendem Kommando gestartet werden:
docker-compose up -d
Soll das Docker-Image in eine andere docker-compose.yaml
oder ein Helm-Chart eingebaut werden, ist darauf zu achten, dass als Volumes die Ordner /masterportal-clientconfigs/portal
und /masterportal-clientconfigs/resources
eingebunden werden.
Die vorgegebene Konfiguration ist in den Ordnern portal
und resources abgelegt und wird mit der mitgelieferten docker-compose.yaml
automatisch eingebunden.
Es können für ein Portal über die URL verschiedene Varianten angezeigt werden.
Die Variante wird als zusätzliche Verzeichniskomponente hinter dem Portalnamen angefügt: /portal/variante
.
Die Variante kann außerdem mit Bindestrichen in Variantenteile geteilt werden: /portal/variante-spezial
.
Die Konfigurationsdatei des Masterportal-Klientenkonfigurationsgenerators nennen wir Klientenkonfiguration (clients.json). Diese Datei enthält alle Parameter, die wir später in unsere Vorlagen (beispielsweise config.json) je nach Aufrufeigenschaften (beispielsweise URL-Variante oder Keycloak-Rolle) einbauen wollen.
Auf der obersten Objektebene der clients.json existieren folgende Schlüssel:
variantLabels
: Hier kann eine Liste an Variantenteilen geführt werden. Die Länge der Liste bestimmt, wie viele Variantenteile maximal zugelassen werden. Der Eintrag in der Liste (Position ist relevant) bestimmt, mit welchem Label wir den entsprechenden Variantenteil im Folgenden referenzieren.via
: Dieser Schlüssel ermöglicht es, Parameter in Abhängigkeit von Aufrufeigenschaften aufzulösen. Unterhalb desvia
-Schlüssels sind die Aufrufeigenschaften, nach denen aufgelöst werden soll, als Schlüssel zu nutzen. Für jeden Eigenschaftsschlüssel sind darunter die möglichen Ausprägungen als Schlüssel zu nutzen. Innerhalb dieser Objekte können dann Parameter definiert werden.
Parameter können sowohl auf der Wurzelebene als auch in einer Ausprägung in einem via
-Block gesetzt werden.
via
-Blöcke können bei Bedarf außerdem verschachtelt werden, das heißt, innerhalb einer Ausprägung kann mit via
zusätzlich nach einer anderen Eigenschaft differenziert werden.
Als Datentypen für Parameter kommen alle JSON-Datentypen in Betracht (auch verschachtelte Datenstrukturen).
Die möglichen Aufrufeigenschaften sind:
variant
: Die (vollständige) Variante.- Eintrag aus
variantLabels
: Der entsprechende Variantenteil. role
: Die Keycloak-Rolle im Feldclient
.roles
: Die Liste der Keycloak-Rollen im Feldclients
.
Beispiel clients.json:
{
"variantLabels": [
"location",
"version"
],
"via": {
"location": {
"kiel": {
"name": "Kiel",
"start": [ 574950, 6021211 ],
"elektro": "wms"
},
"xanten": {
"name": "Xanten",
"start": [ 323866, 5726545 ],
"elektro": "n/v"
}
},
"version": {
"grau": {
"backgroundMap": "wms-basemap-gray"
},
"farbe": {
"backgroundMap": "wms-basemap-color"
}
}
},
"title": "Masterportal-Klientenkonfigurationsgenerator"
}
Beispiel-URL: https://HOSTNAME/portal/xanten-farbe/
HTML- und JavaScript-Dateien (sowie sonstige Textdateien) können als Vorlagen dienen. In diesen Dateien können String-Parameter eingefügt werden (sowie Zahlen und Booleans, welche ebenfalls als String repräsentiert werden können). Eine Einbindung von komplexeren Datenstrukturen (Arrays, Objekte) in Textvorlagen wird nicht unterstützt.
Um einen Parameter in einer Vorlage einzubinden, wird die Syntax {{ TEMPLATE }}
genutzt.
TEMPLATE
kann hierbei eine der folgenden Optionen sein:
true
(oderotherwise
): Boolean-Wert truefalse
: Boolean-Wert falserole
: String-Wert, Rolle aus dem JWTroles
: Array-Wert, Rollen aus dem JWTvariant
: String-Wert, vollständige Varianteopt(VARIANTPART)
: String-Wert, VariantenteilVARIANTPART
env(VARIABLE)
: String-Wert, UmgebungsvariableVARIABLE
'Zeichenketten'
: String-Wert, enthaltene Zeichenkette; dies ist insbesondere nützlich für Vergleiche oder zum Escaping von{{ ... }}
1234
: Number-Wert, die Zahl 1234not (TEMPLATE)
: Boolean-Wert, löst zunächstTEMPLATE
auf und negiert den Wert dann logischeq (LEFT) (RIGHT)
: Boolean-Wert, true g.d.w.LEFT
undRIGHT
zum gleichen Wert auflösenneq (LEFT) (RIGHT)
: Boolean-Wert, false g.d.w.LEFT
undRIGHT
zum gleichen Wert auflösenand (LEFT) (RIGHT)
: Boolean-Wert, true g.d.w.LEFT
undRIGHT
zu truthy-Werten auflösenor (LEFT) (RIGHT)
: Boolean-Wert, true g.d.w.LEFT
oderRIGHT
zu truthy-Werten auflösenelem (ITEM) (LIST)
: Boolean-Wert, true g.d.w.ITEM
ein Element der ListeLIST
ist
Außerdem kann mit alpha.beta[2].gamma
der Parameter eingebunden werden, welcher auf der Wurzelebene der Klientenkonfiguration wie folgt hinterlegt ist:
{ "alpha": { "beta": [ 0, 1, { "gamma": "PARAMETER" } ] } }
Um aufrufeigenschaftenabhängige Parameter einzubinden, muss dem Pfad ein via(PROPERTY)
vorangestellt werden.
PROPERTY
kann hierbei entweder variant
, role
oder ein Schlüssel für einen Variantenteil sein.
In JSON-Vorlagen werden die Werte im JSON analog zur Beschreibung bei den Textvorlagen aufgelöst.
Besteht ein Wert-String jedoch vollständig nur aus genau einer Vorlage ("{{ TEMPLATE }}"
), werden die Werte datentypgetreu ins JSON eingewebt.
In diesem Fall sind dann auch komplexere Datenstrukturen (Arrays, Objekte) möglich.
In Arrays und Objekten werden Einträge, deren Wert ein leeres Objekt ist, gelöscht. Das ermöglicht ein flexibleres Templating mit der unten beschriebenen Methodik.
Wird in einem Objekt als Schlüssel ein String genutzt, der vollständig aus genau einer Vorlage besteht, wird dieser ausgewertet:
- Ist der Schlüssel truthy, werden die anderen Schlüssel im Objekt ignoriert. Das Objekt wird durch den Wert am entsprechenden Schlüssel ersetzt. Sind mehrere Schlüssel truthy, wird der Wert des ersten truthy-Schlüssels genutzt.
- Ist der Schlüssel falsy, wird der Schlüssel und zugehörige Wert ignoriert.
- Ist in einem Objekt kein Schlüssel truthy, wird das Objekt (ohne die vorlagenbehafteten Schlüssel) genutzt, also die vorlagenfreien Schlüssel.
Beispiel config.json:
{
"Portalconfig": {
"portalTitle": {
"title": "{{ title }} - Stadt {{ via(location) name }}"
},
"mapView": {
"startCenter": "{{ via(location) start }}",
}
},
"Themenconfig": {
"Hintergrundkarten": {
"Layer": [
{
"id": "{{ via(version) backgroundMap }}"
}
]
}
"Fachdaten": {
"Layer": [
{
"{{ eq (via(location) elektro) ('wms') }}": {
"id": "wms-ladesaeulen",
"name": "Elektroladesäulen"
},
}
]
}
}
}
Mit der obigen clients.json ergeben sich daraus die folgenden resultierenden config.json-Dateien.
Resultierende config.json für /portal/kiel-grau/:
{
"Portalconfig": {
"portalTitle": {
"title": "Masterportal-Klientenkonfigurationsgenerator - Stadt Kiel"
},
"mapView": {
"startCenter": [ 574950, 6021211 ],
}
},
"Themenconfig": {
"Hintergrundkarten": {
"Layer": [
{
"id": "wms-basemap-gray"
}
]
}
"Fachdaten": {
"Layer": [
{
"id": "wms-ladesaeulen",
"name": "Elektroladesäulen"
}
]
}
}
}
Resultierende config.json für /portal/xanten-farbe/:
{
"Portalconfig": {
"portalTitle": {
"title": "Masterportal-Klientenkonfigurationsgenerator - Stadt Xanten"
},
"mapView": {
"startCenter": [ 323866, 5726545 ],
}
},
"Themenconfig": {
"Hintergrundkarten": {
"Layer": [
{
"id": "wms-basemap-color"
}
]
}
"Fachdaten": {
"Layer": [
]
}
}
}
Im Ordner ./portal
können (wie aus dem klassischen Masterportal bekannt) Portale in Unterordnern erstellt werden.
Die Portalkonfiguration kann jedoch generisch geschrieben werden, indem Parameter dynamisch eingefügt werden.
Die Ressourcendateien (services-internet.json
, rest-services-internet.json
und style_v3.json
) sowie ggf. zusätzliche Ressourcen (beispielsweise Bilder) werden aktuell unverändert an den Client ausgegeben.