enhancement
major
minor
defect
critical
major
minor
major
#30108
pac4j-Anmeldung: Die Konto-Zuordnung erhält die ganze Identität des Identity-Providers (Subject, Claims) statt nur eines Login-Namens
Kontext
Pac4jAuthenticationServlet.getLoginCredentials (com.top_logic.security.auth.pac4j) reduziert eine erfolgreiche Anmeldung am Identity-Provider auf eine Zeichenkette:
String userName = getUserName(profile, clientName); // UserNameExtractor -> String ExternalUserMapping userMapping = Pac4jConfigFactory.getInstance().getUserMapping(clientName); return LoginCredentials.fromUser(userMapping.findAccountForExternalName(userName));
ExternalUserMapping.findAccountForExternalName(String) (tl-core) sieht nur diesen Namen. Die vorhandenen Implementierungen suchen ihn mit Person.byName. Das Subject des Identity-Providers (profile.getId(), bei OpenID Connect der Claim sub) und die übrigen Claims (email, email_verified, …) kommen bei der Zuordnung nicht an.
Eine Anwendung kann ein Konto daher nicht über den stabilen Bezeichner des Identity-Providers zuordnen. Sie kann bei der ersten Anmeldung auch kein Konto anlegen oder verknüpfen, wenn dafür mehr als ein Wert gebraucht wird. Beispiel Steueranwendung (tl-factory, Issue 2): Ein Verwalter lädt ein Mitglied per E-Mail-Adresse ein. Bei der ersten Anmeldung soll das Konto über die verifizierte E-Mail-Adresse der Einladung gefunden und dann dauerhaft über sub zugeordnet werden, nie über den Anzeigenamen.
Verwandt: #22471 (Accounts über OpenID föderieren) und #26452 (Einfachere Registrierung für Login über OpenID). Dieses Ticket ist der kleine, allgemeine Teil, den beide brauchen: die Schnittstelle der Zuordnung.
Lösung
- ExternalUserMapping bekommt eine Methode, die die ganze authentifizierte Identität erhält: Name des Clients, Subject, den extrahierten Namen und die Claims (z.B. ein unveränderlicher Wert-Typ ExternalIdentity). Die Default-Implementierung ruft findAccountForExternalName(name) auf. Bestehende Zuordnungen verhalten sich damit unverändert.
- Pac4jAuthenticationServlet übergibt das Profil über diese Methode.
- Eine Anwendung kann in ihrer Zuordnung ein Konto über das Subject finden oder es in einer eigenen Transaktion anlegen bzw. verknüpfen. Trifft beides nicht zu, verweigert sie mit UnknownAccountException, und die bestehende Seite für unbekannte Konten erscheint.
- Test: Eine Zuordnung erhält Subject und Claims einer Anmeldung; die Default-Implementierung liefert dasselbe Konto wie bisher.