Migrationsleitfaden IsyFact 3.3.x
Diese Seite ist ein Teil der IsyFact-Standards. Alle Inhalte der Seite, insbesondere Texte und Grafiken, sind urheberrechtlich geschützt. Alle urheberrechtlichen Nutzungs- und Verwertungsrechte liegen beim Bundesverwaltungsamt.
Die Nutzung ist unter den Lizenzbedingungen der Creative Commons Namensnennung 4.0 International gestattet.
Für die IsyFact gibt es hiermit drei Versionszweige: IsyFact 1, IsyFact 2 und seit Q1/2023 das neue Major-Release IsyFact 3.0.
Die auf dieser Seite aufgeführten Hinweise sollen IsyFact Anwendungsentwicklern bei der Umstellung einer auf IsyFact 2 basierenden Anwendung auf IsyFact 3.3.x helfen.
1. Geschäftsanwendung
1.1. Bridge-Module
Die drei in IsyFact 2 eingeführten Bridge-Module
-
isy-serviceapi-core-bridge
-
isy-serviceapi-sst-bridge
-
isy-exception-sst-bridge
entfallen in IsyFact 3. In einer Anwendung, die bisher Bridge-Module verwendet und auf IsyFact 3 umgestellt werden soll, müssen daher Anpassungen vorgenommen werden. Die Tabelle Abhängigkeiten in IsyFact 2 vs. IsyFact 3 zeigt für jedes der drei Bridge-Module, durch welches Modul es ersetzt wird. Dabei ist zu beachten, dass zwei der Ersatzmodule eine Abhängigkeit zu IsyFact-1.x haben.
Abhängigkeit in IsyFact 2 | Abhängigkeit in IsyFact 3 |
---|---|
|
|
|
|
|
|
Zudem wird die Klasse
de.bund.bva.isyfact.exception.service.bridge.util.BridgeExceptionMapper
ersetzt durch:
de.bund.bva.isyfact.serviceapi.common.exception.ExceptionMapper
1.2. Überwachung
Es sind die Nutzungsvorgaben Überwachung zu IsyFact 3 zu verwenden.
2. Bausteine
2.1. Aufrufkontext
Der Baustein |
Mit dem Umstieg auf isy-security
und der Verwendung von REST Schnittstellen wird isy-aufrufkontext
nicht länger benötigt.
2.2. Konfiguration
Der Baustein |
Hintergrund der Deprecation und der Entfernung des Bausteines ist, dass isy-konfiguration
schon seit IsyFact 2 nicht mehr weiterentwickelt wird und stattdessen von Springframework bereit gestellte Mechanismen genutzt werden sollen.
Die Dokumentation der Konfiguration mit Spring ist unter folgender Adresse zu finden:
2.3. Batchrahmen
In IsyFact 3.0 wurde mit der Umstellung auf isy-security
das Detailkonzept zur Authentifizierung und Autorisierung aktualisiert.
Statt Benutzer, Passwort und BHKNZ muss in der Batch-Konfiguration eine oauth2ClientRegistrationId
konfiguriert werden (siehe Eigenschaften eines Batchbenutzers)
batch.benutzer=TestUser
batch.passwort=TestPasswort
batch.bhknz=TestBHKNZ
# [...]
batch.oauth2ClientRegistrationId=TestClient
# [...]
Eine entsprechende Spring Security ClientRegistration wird durch isy-security
Konfigurationsparameter bereitgestellt.
Die folgenden Beispiele zeigen wie Konfigurationen nach der Migration aussehen können.
Für die Batch-Konfiguration ist nicht relevant, ob die ClientRegistration den Resource-Owner-Password-Credentials Flow (authorization-grant-type: password
) oder nach der empfohlenen Migration von technischen Nutzern zu Confidential Clients den Client-Credentials Flow (authorization-grant-type: client_credentials
) nutzt.
batch.oauth2ClientRegistrationId=TestClient
# [...]
spring.security.oauth2.client.provider.TestRealm.issuer-uri=http://localhost:9095/auth/realms/testrealm
spring.security.oauth2.client.registration.TestClient.client-id=test-client-id
spring.security.oauth2.client.registration.TestClient.client-secret=test-client-secret
spring.security.oauth2.client.registration.TestClient.authorization-grant-type=password
spring.security.oauth2.client.registration.TestClient.provider=TestRealm
# Benutzer, Passwort und BHKNZ werden auf die selbe registrationId abgebildet
isy.security.oauth2.client.registration.TestClient.username=TestUser
isy.security.oauth2.client.registration.TestClient.password=TestPasswort
isy.security.oauth2.client.registration.TestClient.bhknz=TestBHKNZ
batch.oauth2ClientRegistrationId=TestClient
# [...]
spring.security.oauth2.client.provider.TestRealm.issuer-uri=http://localhost:9095/auth/realms/testrealm
spring.security.oauth2.client.registration.TestClient.client-id=test-user-client-id
spring.security.oauth2.client.registration.TestClient.client-secret=test-user-client-secret
spring.security.oauth2.client.registration.TestClient.authorization-grant-type=client_credentials
spring.security.oauth2.client.registration.TestClient.provider=TestRealm
Die Bausteine isy-sicherheit
und isy-sicherheit-keycloak
werden durch isy-security
abgelöst.
2.4. Task Scheduler
In IsyFact 3.0 wurden mit der Umstellung auf isy-security
die Nutzungsvorgaben zur Authentifizierung von Tasks aktualisiert.
Statt Benutzer, Passwort und BHKNZ (siehe Properties mit isy-sicherheit in IsyFact 2) muss in den Task Properties eine oauth2ClientRegistrationId
konfiguriert werden (siehe Properties mit isy-security in IsyFact 3).
isy.task.tasks.halloWeltTask.benutzer=TestUser
isy.task.tasks.halloWeltTask.passwort=TestPasswort
isy.task.tasks.halloWeltTask.bhkz=TestBHKNZ
# [...]
isy.task.tasks.halloWeltTask.oauth2ClientRegistrationId=TestClient
# [...]
Eine entsprechende Spring Security ClientRegistration wird durch isy-security
Konfigurationsparameter bereitgestellt.
Die folgenden Beispiele zeigen wie Konfigurationen nach der Migration aussehen können.
Für die TaskScheduler-Konfiguration ist nicht relevant, ob die ClientRegistration den Resource-Owner-Password-Credentials Flow (authorization-grant-type: password
) oder nach der empfohlenen User-Migration von einem natürlichen User auf ein technischen Nutzer den Client-Credentials Flow (authorization-grant-type: client_credentials
) nutzt.
isy.task.tasks.halloWeltTask.oauth2ClientRegistrationId=TestClient
# [...]
spring.security.oauth2.client.provider.TestRealm.issuer-uri=http://localhost:9095/auth/realms/testrealm
spring.security.oauth2.client.registration.TestClient.client-id=test-client-id
spring.security.oauth2.client.registration.TestClient.client-secret=test-client-secret
spring.security.oauth2.client.registration.TestClient.authorization-grant-type=password
spring.security.oauth2.client.registration.TestClient.provider=TestRealm
# Benutzer, Passwort und BHKNZ werden auf die selbe oauth2ClientRegistrationId abgebildet
isy.security.oauth2.client.registration.TestClient.username=TestUser
isy.security.oauth2.client.registration.TestClient.password=TestPasswort
isy.security.oauth2.client.registration.TestClient.bhknz=TestBHKNZ
isy.task.tasks.halloWeltTask.oauth2ClientRegistrationId=TestClient
# [...]
spring.security.oauth2.client.provider.TestRealm.issuer-uri=http://localhost:9095/auth/realms/testrealm
spring.security.oauth2.client.registration.TestClient.client-id=test-user-client-id
spring.security.oauth2.client.registration.TestClient.client-secret=test-user-client-secret
spring.security.oauth2.client.registration.TestClient.authorization-grant-type=client_credentials
spring.security.oauth2.client.registration.TestClient.provider=TestRealm
2.5. Service
Ab IsyFact 3 ist die Verwendung von REST-Schnittstellen für die Neuentwicklung verbindlich.
Spring HTTP-Invoker ist deprecated und wird ab sofort als Schnittstellenformat durch REST abgelöst.
Die Verwendung von REST-Schnittstellen wird im Baustein REST (siehe Konzept REST und Nutzungsvorgaben REST) erläutert.
Desweiteren wurden die Bridge-Module |
Mit der Verwendung von Damit dennoch alte HTTP-Invoker Schnittstellen aufgerufen werden können (welche einen gefüllten AufrufKontext benötigen), wird eine spezielle Weitere Informationen können unter Nutzungsvorgaben HTTP-Invoker nachgelesen werden. |
2.6. Sicherheit
2.6.1. Konfiguration
Eine Beschreibung der Parameter findet sich in den Nutzungsvorgaben Security und der Dokumentation von Spring Security.
Tabelle 1 gibt eine Übersicht über die zu ändernden Parameter.
Die instances[n]
Notation aus den isy-sicherheit-keycloak Properties wird in isy-security nicht länger unterstützt.
Jede Instanz soll durch eine sprechende und eindeutige registration-id
ersetzt werden.
Falls mehrere Instanzen für das gleiche Realm konfiguriert wurden, kann der provider-name
pro Realm einmalig konfiguriert und für mehrere OAuth 2.0 Client Registrations (registration-id
) wiederverwendet werden.
Falls Keycloak als Identity Provider verwendet wird, müssen für die Clients zusätzlich ein "Realm Role Mapper", der die Realm-Rollen in den in |
Aus Platzgründen wurde in der ersten Spalte auf das isy.sicherheit.keycloak
Präfix verzichtet.
Analog wurde bei allen Properties der zweiten Spalte, die mit einem Punkt beginnen, auf das Präfix spring.security.oauth2.client
verzichtet.
isy-sicherheit(-keycloak) |
isy-security |
Bemerkung |
|
|
Issuer, gegen den einkommende Bearer Tokens validiert werden sollen. An den bisherigen Wert wird |
|
|
Für die Verwendung in Kombination mit einer Spring Client Registration. An den bisherigen Wert wird |
|
- |
Entfällt, da Teil der |
- |
|
Neu, verbindet die Spring Client Registration und Provider Definition. |
|
|
Neu, Authentifizierungsidentifier der ConfidentialClient-Applikation im Autorisierungsserver. |
|
|
Neu, Authentifizierungs-Secret, das nur der ConfidentialClient-Anwendung und dem Autorisierungsserver bekannt ist. |
- |
|
Neu, da ein zusätzlicher OAuth Flow unterstützt wird. Der Wert |
|
- |
entfällt |
|
|
|
|
|
|
- |
|
Neu, für ConfidentialClient-Konfiguration der geänderte Pfad für Property |
- |
|
Neu, für ConfidentialClient-Konfiguration der geänderte Pfad für Property |
- |
|
Neu, für ConfidentialClient-Konfiguration der geänderte Pfad für Property |
|
- |
entfällt |
|
- |
entfällt |
|
- |
entfällt |
|
- |
entfällt |
|
- |
entfällt |
|
- |
entfällt |
Bei der Verwendung von |
2.6.2. @Gesichert
Die Annotation @Gesichert
wird ersetzt durch die Spring-Annotation @Secured
.
Analog wird die Klasse GesichertInterceptor
abgelöst durch SecuredInterceptor
.
@Secured
akzeptiert in isy-security
nur Parameter, die mit PRIV_
beginnen.
Beim Abbilden von Rollen auf Rechte wird in isy-security
das Präfix PRIV_
automatisch gesetzt.
Dies verdeutlicht die Abgrenzung zu Rollen, für die Spring das Präfix ROLE_
verwendet.
@Gesichert("RECHT_A")
muss daher geändert werden zu @Secured("PRIV_Recht_A")
.
Werden mehrere Rechte an die Annotation übergeben, so sind sie bei Um konjunktive Verknüpfungen auch weiterhin umzusetzen, sollte die Annotation Dadurch sind Ausdrücke möglich wie
|
2.6.3. Berechtigungsmanager
Im Interface Berechtigungsmanager
ändern sich die Rückgabewerte der Methoden getRechte()
und getRollen()
zu Set<String>
.
Grund dafür ist, dass die POJOs Recht
und Rolle
abgeschafft und durch String
-Werte ersetzt wurden.
2.6.4. Interface Sicherheit
Das Interface Sicherheit
wird abgelöst durch das Interface Security
.
Folgende Änderungen sind dabei relevant:
-
Die Methode
getBerechtigungsManagerUndAuthentifiziere()
wird entfernt und durch zwei neue Methoden im InterfaceSecurity
ersetzt. Die Aufgaben sind hierbei wie folgt verteilt:-
Die Methode
getAuthentifizierungsmanager()
liefert das InterfaceAuthentifizierungsmanager
zurück, über dessen Implementierung dann eine Authentifizierung mit dem konfigurierten OpenID Connect Provider (bspw. Keycloak) durchgeführt werden kann. Nach erfolgreicher Authentifizierung wird das Bearer Token im Spring Security Context hinterlegt (siehe Nutzungsvorgaben zuAuthentifizierungsmanager
). -
Die Methode
getBerechtigungsmanager()
liefert das InterfaceBerechtigungsmanager
zurück, über dessen Implementierung dann auf die im Bearer Token enthaltenen Autorisierungsinformationen zugegriffen werden kann. Konkret sind in dem InterfaceBerechtigungsmanager
Methoden definiert, über dessen Implementierung Berechtigungen und Rollen abgefragt werden können (siehe Nutzungsvorgaben isy-security).
-
-
Die Methode
leereCache()
entfällt. -
Wie in Abschnitt Berechtigungsmanager beschrieben, ändert sich der Rückgabewerte der Methode
Set<Rolle>
zuSet<String>
.
2.6.5. @NutzerAuthentifizierung
Die Annotation @NutzerAuthentifizierung
wird entfernt und durch eine neue Annotation @Authenticate
ersetzt.
Der Annotation @Authenticate
wird die Client-Registration-ID eines OAuth2.0-Clients übergeben.
Der entsprechende Client muss dafür gemäß den Nutzungsvorgaben Security konfiguriert sein.
Hierfür werden die OAuth2ClientProperties
verwendet, sodass bei der Nutzung von @Authenticate
gegenüber @NutzerAuthentifizierung
die Notwendigkeit für das
Erstellen der NutzerAuthentifizierungProperties
entfällt.
Entsprechend muss allerdings die spring-security-oauth2-client
-Dependency eingebunden sein.
Zusätzliche für die Aktivierung der Annotation notwendige Beans müssen nicht mehr definiert werden,
da diese durch die IsyOAuth2ClientAutoConfiguration
erstellt werden, solange die Gegebenheiten für die Erstellung von ClientRegistrations vorhanden sind.
Beispiel für die Konfiguration mit @NutzerAuthentifizierung
:
@NutzerAuthentifizierung(benutzer = "test-benutzer")
<property-prefix>.benutzer.test-benutzer.kennung = benutzer-name
<property-prefix>.benutzer.test-benutzer.passwort = super_secret_password
<property-prefix>.benutzer.test-benutzer.bhknz = 123456
Beispiel für die Konfiguration mit @Authenticate
:
@Authenticate(oauth2ClientRegistrationId = "test-client") // fest
oder
@Authenticate(oauth2ClientRegistrationId = "${test-project.client-id}") // mit Property-Platzhalter
Die Client-ID kann sowohl fest als auch in Form eines Property-Platzhalters an die Annotation gegeben werden. Beispiele für weitere Schreibweisen sind in den Nutzungsvorgaben Security zu finden.
# Property-Platzhalter
test-project.client-id = test-client
spring.security.oauth2.client.provider.testrealm.issuer-uri = http://localhost:12345/auth/realms/testrealm
spring.security.oauth2.client.registration.test-client.client-id = client-credentials-test-client
spring.security.oauth2.client.registration.test-client.client-secret = super_secret_password
spring.security.oauth2.client.registration.test-client.authorization-grant-type = client_credentials
spring.security.oauth2.client.registration.test-client.provider = testrealm
2.6.6. AccessManager und zugehörige Klassen
Das Interface AccessManager
sowie zugehörige Interfaces entfallen.
Genauer wurden folgende Interfaces entfernt:
de.bund.bva.isyfact.sicherheit.accessmgr.AccessManager
de.bund.bva.isyfact.sicherheit.SicherheitAdmin
de.bund.bva.isyfact.sicherheit.accessmgr.AuthentifizierungsErgebnis
2.6.7. Exceptions
Die Exceptions aus dem Paket de.bund.bva.isyfact.sicherheit.common.exception
entfallen.
Sie werden durch Exceptions aus Spring Security ersetzt.
Eine Ausnahme davon bildet die Exception
de.bund.bva.isyfact.sicherheit.common.exception.RollenRechteMappingException,
die ersetzt wird durch:
de.bund.bva.isyfact.security.xmlparser.RolePrivilegesMappingException
2.6.8. Mock für Testumgebungen
Der Baustein isy-security-test
stellt zum Erstellen von (automatisierten) Tests einen OpenId Connect Provider Mock bereit.
Dieser löst den Keycloak Mock aus isy-sicherheit-keycloak-test
ab.
Die Klassen und Interfaces
de.bund.bva.isyfact.sicherheit.keycloak.test.EmbeddedKeycloakStub
de.bund.bva.isyfact.sicherheit.keycloak.test.KeycloakMockBase
de.bund.bva.isyfact.sicherheit.keycloak.test.EmbeddedKeycloakMock
de.bund.bva.isyfact.sicherheit.keycloak.test.RemoteKeycloakMock
de.bund.bva.isyfact.sicherheit.keycloak.test.RsaKeyGenerator
werden ersetzt durch:
de.bund.bva.isyfact.security.test.oidcprovider.EmbeddedOidcProviderStub
de.bund.bva.isyfact.security.test.oidcprovider.OidcProviderMockBase
de.bund.bva.isyfact.security.test.oidcprovider.EmbeddedOidcProviderMock
de.bund.bva.isyfact.security.test.oidcprovider.RemoteOidcProviderMock
de.bund.bva.isyfact.security.test.RsaKeyGenerator
Dabei haben sich die Konstruktoren, Felder und Methodensignaturen leicht geändert.
Konstruktoren
-
Die Konstruktoren haben keinen Parameter vom Typ
RsaKeyGenerator
mehr. Falls bisher ein Konstruktor verwendet wurde, der als einen der Parameter ein Objekt vom TypRsaKeyGenerator
empfängt, kann dieser Parameter bei der Umstellung gestrichen werden. -
Konstruktoren, die bisher zwei Objekte vom
java.security.PrivateKey
undjava.security.PublicKey
empfangen haben, wurden zusammengefasst in einem Objekt vom Typjava.security.KeyPair
.
Felder
Die Änderungen der Felder sind in den nachfolgenden Tabellen beschrieben. Die Namen der zugehörigen Getter-Methoden wurden angepasst.
EmbeddedKeycloakMock (IFS 2) | EmbeddedOidcProviderMock (IFS 3) |
---|---|
|
|
EmbeddedKeycloakStub (IFS 2) | EmbeddedOidcProviderStub (IFS 3) |
---|---|
|
|
Methodensignaturen
Die Änderungen der Methodensignaturen sind in den nachfolgenden Tabellen beschrieben.
KeycloakMockBase (IFS 2) | OidcProviderMockBase (IFS 3) | Änderung |
---|---|---|
|
|
neue Parameter |
EmbeddedKeycloakStub (IFS 2) | EmbeddedOidcProviderStub (IFS 3) | Änderung |
---|---|---|
|
|
geänderter Methodenname und Rückgabetyp |
|
|
geänderter Methodenname |
|
|
zusätzlicher Parameter |
|
|
zusätzlicher Parameter |
|
|
zusätzlicher Parameter |
|
|
zusätzlicher Parameter |
|
|
zusätzlicher Parameter |
|
|
geänderter Parametertyp |
|
|
zusätzlicher Parameter |
|
|
geänderter Parametertyp |
2.7. Persistence
In IsyFact 3 werden DataSourceProperties
von Spring Boot verwendet und lediglich um die Attribute schemaVersion
und schemaInvalidVersionAction
erweitert.
Hierdurch haben sich die Namen der Konfigurationsschlüssel geändert und müssen angepasst werden.
Details zur Konfiguration sind in den Nutzungsvorgaben Persistence zu finden.