enhancement
major
minor
defect
critical
major
minor
major
#30179
Eine Anwendung, die mit „useSSO=true“ erstellt wurde, bietet die generische OpenID-Anmeldung an, die über die Umgebungsvariablen „tl_pac_*“ aktiviert wird – auch auf dem Entwicklungsserver.
Problem
Der Archetyp „tl-archetype-app“ verfügt über die Eigenschaft „useSSO“. Er fügt der generierten POM lediglich die Abhängigkeit „tl-security-auth-pac4j“ hinzu. Die Datei „metaConf.txt“ des Moduls lädt ausschließlich „tlPac4jConf.xml “. Der generische OpenID-Connect-Client (pac4j-generic.xml / pac4j-generic.config.xml, der die Werte tl_pac_discovery_uri, tl_pac_client_id, tl_pac_scope, tl_pac_secret) wird durch das Profil „with-openid-generic“ von „tl-parent-app“ aktiviert. Dieses Profil wirkt sich nur auf die erstellte WAR-Datei aus (tl.app.metaConfAddons.*, TLAppWar).
Infolgedessen verfügt eine Anwendung, die mit useSSO=true generiert und auf dem Entwicklungsserver (exec:java, deploy/local) gestartet wurde, über keine generische OpenID-Anmeldung, selbst wenn alle tl_pac_*-Variablen gesetzt sind. Zudem definiert pac4j-generic.xml %PAC_DISCOVERY_URI% als ${env:tl_pac_discovery_uri} ohne Standardwert, sodass eine bedingungslose Aktivierung nicht unbedenklich ist.
Die Steuerungsanwendung tl-factory generiert ihre Projekte mit diesem Archetyp und möchte, dass sich jedes neue Projekt über einen OpenID-Anbieter anmeldet, dessen Einstellungen der Arbeitsbereich als tl_pac_*- Variablen übergibt. Ohne diese Variablen, beispielsweise nach der Bereitstellung, sollte keine Schaltfläche angeboten werden (Gitea-Issue TopLogic/tl-factory#47).
Entwurf
- Bei useSSO=true aktiviert die generierte Anwendung den generischen Client selbst: Ihre eigene metaConf.txt verweist auf pac4j-generic.xml, sodass sich der Entwicklungsserver und die WAR-Datei gleich verhalten.
- Der generische Client ist ohne seine Variablen harmlos. Jeder Alias in pac4j-generic.xml verfügt über einen Standardwert (leere Discovery-URI, leerer Secret), die Anwendung startet fehlerfrei, und die Anmeldeseite bietet keine Schaltfläche an, solange tl_pac_secret fehlt. Ein Secret ohne Discovery-URI ist ticket:30173.
- Die Beschriftung der Schaltfläche ist ebenfalls eine Einstellung (z. B. tl_pac_label) mit einem neutralen Standardwert.
- Der Artikel „application-project“ beschreibt useSSO und die Variablen.
Akzeptanz
- Eine mit useSSO=true generierte Anwendung startet auf dem Entwicklungsserver ohne jegliche tl_pac_*- Variable, ohne Fehler und ohne OpenID-Schaltfläche.
- Sind tl_pac_discovery_uri, tl_pac_client_id und tl_pac_secret gesetzt, bietet die Anmeldeseite die Schaltfläche mit der konfigurierten Beschriftung an, und die Anmeldung bei einem Anbieter (z. B. Keycloak über dessen Discovery-URI) wird abgeschlossen.
- Die WAR-Datei einer solchen Anwendung verhält sich genauso.
- „useSSO=false“ erzeugt wie bisher keine pac4j-Konfiguration.
Lösung
- com.top_logic.security.auth.pac4j: Jeder Alias von pac4j-generic.xml und die gemeinsamen Aliase von tlPac4jConf.xml erhalten einen expliziten Standardwert (${env:...:}), sodass bei einem Start ohne die Variablen keine fehlenden Variablen protokolliert werden. Der generische Client erhält das Label %PAC_LABEL% aus tl_pac_label; ein leeres Label greift auf einen übersetzten Standardwert des Moduls zurück („Log in with single sign-on“ / „Mit Single Sign-on anmelden“), nicht mehr auf den technischen Client-Namen. Ein leerer Geltungsbereich wird an pac4j als nicht festgelegt übergeben, sodass dessen Standardgeltungsbereich gilt.
- tl-archetype-app: Bei useSSO=true verweist die Datei src/main/webapp/WEB-INF/conf/metaConf.txt der Anwendung auf pac4j-generic.xml. Dieser eine Eintrag aktiviert den Client auf dem Entwicklungsserver und in der WAR; es ist weder ein Build-Profil noch ein Eintrag unter „deploy/local“ erforderlich. Bei „useSSO=false“ wird kein solcher Eintrag generiert.
- Der Artikel „application-project“ beschreibt „useSSO“ anhand der Variablen „tl_pac_discovery_uri“, „tl_pac_client_id“, „tl_pac_secret“, „tl_pac_scope“ und „tl_pac_label“.
- Nicht Gegenstand dieses Artikels: die anbieterspezifischen Profile (Keycloak, Azure, Google).