Beispiel: NovarisLegacyLoginModule + LegacyUserDirectory (novaris-policy-web-legacy-jsf).
Bevor SAML/OIDC in Unternehmens-Java-EE-Landschaften Einzug hielten, war die Kombination aus JAAS Custom Login Module (Authentifizierung) und LTPA (Single-Sign-on zwischen WebSphere-Anwendungen) der Standardweg fuer Unternehmensauthentifizierung auf WebSphere. Beide Teile sind konzeptionell getrennt und loesen unterschiedliche Probleme.
Siehe NovarisLegacyLoginModule-Javadoc fuer den vollstaendigen Code-Walkthrough. Der Kern:
JAAS definiert einen genormten Lebenszyklus (initialize → login → commit/abort),
den jeder Login-Provider implementieren kann, ohne dass der Container wissen muss, WIE
konkret geprueft wird. Diese Klasse prueft gegen LegacyUserDirectory (in diesem Projekt
ein simulierter In-Memory-Speicher) - in einer echten Landschaft waere das haeufig eine
LDAP-Bind-Operation oder eine Abfrage gegen ein eigenes Altsystem-Benutzerverzeichnis, das
schon lange vor WebSphere existierte und nie durch LDAP abgeloest wurde. Genau das ist
der historische Grund, warum es ueberhaupt ein Custom Login Module gibt - die eingebauten
WebSphere-Registries (lokale Datei, LDAP) reichen nicht, wenn die "Wahrheit" ueber
Benutzer in einem proprietaeren Altsystem liegt.
WebSphere traditional: Admin Console → Security → Global Security → Java Authentication and
Authorization Service → Application logins → neuer Eintrag mit der voll-qualifizierten
Klasse com.novaris.legacy.web.security.NovarisLegacyLoginModule. WebSphere Liberty:
gleichwertig ueber server.xml:
<jaasLoginContextEntry name="NovarisFormLogin">
<jaasLoginModule className="com.novaris.legacy.web.security.NovarisLegacyLoginModule"
controlFlag="required"/>
</jaasLoginContextEntry>
Der realm-name in web.xml (<login-config><realm-name>NovarisFormLogin</realm-name>)
verweist auf genau diesen Eintrag - das ist die Bruecke zwischen "wie soll sich der Nutzer
anmelden" (Web-Deskriptor) und "wie wird tatsaechlich geprueft" (JAAS-Konfiguration).
LTPA (Lightweight Third Party Authentication) ist ein WebSphere-proprietaeres
Single-Sign-on-Verfahren. Nach erfolgreichem Login (Teil 1) stellt WebSphere selbst - nicht
die Anwendung, nicht das Login Module - ein signiertes Token aus, das als Cookie
(LtpaToken2) an den Browser geht. Jede WebSphere-Anwendung, die dieselben LTPA-Schluessel
verwendet (typischerweise alle Anwendungen derselben "Zelle"), akzeptiert dieses Cookie als
Nachweis einer bereits erfolgten Anmeldung - der Nutzer meldet sich nur einmal an und
bewegt sich danach nahtlos zwischen mehreren WebSphere-Anwendungen, ohne erneut Zugangsdaten
einzugeben.
Warum das hier nur dokumentiert, nicht implementiert wird: LTPA-Tokens sind mit
WebSphere-internen, proprietaeren Schluesseln signiert - es gibt keine sinnvolle Moeglichkeit,
dieses Verhalten ausserhalb einer echten WebSphere-Installation nachzubauen oder zu testen.
Das ist eine bewusste, saubere Grenze: alles, was mit Standard-Java-SE-Mitteln (JAAS selbst)
funktioniert, ist in diesem Projekt echter, lauffaehiger und getesteter Code
(NovarisLegacyLoginModuleTest); alles, was WebSphere-proprietaer ist (LTPA-Ausstellung/
-Validierung), ist Dokumentation.
Browser --FORM-POST(j_username,j_password)--> j_security_check (Container-Mechanismus)
|
JAAS: NovarisLegacyLoginModule.login()/commit()
|
Subject mit NovarisPrincipal + NovarisRolePrincipal(s)
|
WebSphere stellt LTPA-Token aus (Cookie LtpaToken2)
|
Folgeanfragen (auch an ANDERE WebSphere-Anwendungen derselben Zelle)
werden anhand des LTPA-Cookies automatisch authentifiziert - kein
erneuter Login-Durchlauf noetig
⌂ Cockpit