Der Aufbau von Healthcare-Anwendungen auf Basis eines FHIR-Servers ist gĂ€ngige Praxis geworden. FHIR-Server bieten standardisierte Speicherung und APIs fĂŒr klinische Ressourcen und ermöglichen es Entwicklern, sich auf die Implementierung von Funktionen zu konzentrieren, anstatt die Infrastruktur fĂŒr Gesundheitsdaten zu verwalten. Dies wirft jedoch eine wichtige Frage auf: Wie stellen Sie sicher, dass verschiedene Benutzer nur die Daten sehen, auf die sie berechtigt sind?
Ein Arzt sollte beispielsweise vollstĂ€ndigen Zugriff auf Patientenbeobachtungen haben â sowohl auf Laborbefunde als auch auf Vitalzeichen. Ein Labortechniker hingegen sollte nur abgeschlossene Laborbefunde sehen, die fĂŒr seine Arbeit relevant sind. Die Implementierung dieser Art von feingranularer Zugriffskontrolle erfordert traditionell komplexe Logik auf Anwendungsebene, benutzerdefinierte Autorisierungsregeln und umfangreiche Tests.
Es gibt einen besseren Weg: einen standardbasierten Ansatz, der Ihren vorhandenen Identity Provider nutzt und keinerlei benutzerdefinierten Autorisierungscode in Ihrer Anwendung erfordert.
In diesem Beitrag erlĂ€utern wir, wie Sie eine ausgefeilte rollenbasierte Zugriffskontrolle (RBAC) fĂŒr FHIR-Ressourcen mithilfe von Keycloak-Rollen (einer Open-Source-Lösung fĂŒr Identity- und Access-Management), die SMART on FHIR V2-Scopes zugeordnet werden, und der automatischen Durchsetzung durch Aidbox implementieren. Das Beste daran: Derselbe API-Endpunkt gibt je nach anfragender Person unterschiedliche Daten zurĂŒck â vollstĂ€ndig transparent.
Das Problem: Ein Endpunkt, mehrere Zugriffsebenen
Stellen Sie sich vor, Sie entwickeln eine Healthcare-Anwendung auf Basis des FHIR-Servers mit zwei Benutzertypen:
Dr. Sarah (Ărztin)
- Muss alle Patientenbeobachtungen einsehen können
- ĂberprĂŒft sowohl Laborbefunde als auch Vitalzeichen
- Trifft klinische Entscheidungen auf Grundlage vollstÀndiger Patientendaten
Mike (Labortechniker)
- Arbeitet ausschlieĂlich mit abgeschlossenen Laborbefunden
- Sollte keine Vitalzeichen oder vorlÀufigen Labordaten sehen
- Benötigt Zugriff, der auf seine spezifische Aufgabe beschrÀnkt ist
Beide Benutzer rufen denselben API-Endpunkt auf: GET /fhir/Observation. Aber sie sollten völlig unterschiedliche Ergebnisse sehen.
Traditionell wĂŒrden Entwickler dieses Problem durch folgende MaĂnahmen lösen:
- Benutzerdefinierte Middleware zur ĂberprĂŒfung von Benutzerrollen
- Komplexe Abfragefilter im Anwendungscode
- Separate API-Endpunkte oder Parameter fĂŒr verschiedene Benutzertypen
- Umfangreiche Unit-Tests fĂŒr jedes Autorisierungsszenario
- Wartungsaufwand bei sich Àndernden Anforderungen
Dieser Ansatz funktioniert, ist jedoch schwer zu warten und fehleranfÀllig, wenn sich Anforderungen weiterentwickeln. Es gibt einen besseren Weg.
Die Lösung: SMART-Scopes treffen auf Keycloak-Rollen
SMART on FHIR V2 fĂŒhrt ein leistungsstarkes Konzept ein: Scopes mit Abfrageparametern. Anstatt nur breiten Zugriff zu gewĂ€hren wie âdieser Benutzer kann Observations lesen", können Sie exakte Regeln festlegen, zum Beispiel:
user/Observation.rs?category=laboratory&status=final
Dieser Scope bedeutet: âDer Benutzer kann Observations lesen und durchsuchen, jedoch nur Laborbeobachtungen mit dem Status âfinal'."
Durch die Kombination mit dem Composite-Rollen-System von Keycloak können wir:
- Granulare Berechtigungen als einfache Keycloak-Rollen definieren (jede reprÀsentiert einen SMART-Scope)
- Sie zu Aufgabenfunktionen zusammenfassen mithilfe von Composite-Rollen (wie âphysician" oder âlab_technician")
- Composite-Rollen automatisch auflösen in SMART-Scopes im Zugriffstoken
- Aidbox die Regeln automatisch durchsetzen lassen â kein benutzerdefinierter Code erforderlich
So funktioniert der Ablauf:
User Login â Keycloak resolves roles â Token with SMART scopes â
Aidbox validates token â Automatic data filtering â Correct results
Implementierung: Aufbau der Rollenstruktur
Schritt 1: Basisrollen definieren (granulare SMART-Scopes)
In Keycloak erstellen wir Basisrollen, die direkt auf SMART on FHIR V2-Scopes abgebildet werden:
Basisrollen:
user/Patient.rs â Patientendaten lesen und durchsuchenuser/Encounter.rs â Begegnungen lesen und durchsuchenuser/Observation.rs â ALLE Observations lesen und durchsuchenuser/Observation.rs?category=laboratory&status=final â NUR abgeschlossene Laborbefunde lesen und durchsuchen
Diese Basisrollen sind die Bausteine. Jede reprÀsentiert eine spezifische Berechtigung mit optionalen Abfrageparameter-EinschrÀnkungen.
Schritt 2: Composite-Rollen erstellen (Aufgabenfunktionen)
Als NĂ€chstes kombinieren Sie Basisrollen zu Composite-Rollen, die reale Aufgabenfunktionen widerspiegeln:
Physician-Rolle (vollstÀndiger klinischer Zugriff):
user/Patient.rsuser/Encounter.rsuser/Observation.rs
Lab-Technician-Rolle (beschrÀnkt auf Laborbefunde):
user/Patient.rsuser/Observation.rs?category=laboratory&status=final
Beachten Sie, dass die Lab-Technician-Rolle den eingeschrĂ€nkten Observation-Scope verwendet â dadurch wird der Zugriff auf Vitalzeichen oder Entwurfsergebnisse verhindert.
Schritt 3: Den Token-Mapper konfigurieren
Hier geschieht die eigentliche Magie. Keycloak wandelt Rollen in Zugriffstoken um. Das Token ist eine kleine, sichere Datei (JSON Web Token â JWT), die jede API-Anfrage begleitet und Aidbox mitteilt, was der Benutzer tun darf. Wir mĂŒssen Keycloak dazu bringen:
- Composite-Rollen (z. B. âphysician") in ihre grundlegenden Basisrollen aufzulösen
- Diese Basisrollen im
scope-Claim des Tokens als SMART-Scopes einzuschlieĂen - Den Claim
atv: "2"hinzuzufĂŒgen, um anzugeben, dass im Token SMART on FHIR-Scopes zur Verarbeitung vorhanden sind
Dies erreichen wir mithilfe eines benutzerdefinierten skriptbasierten Protocol Mappers. Wenn sich ein Labortechniker anmeldet, sieht sein Zugriffstoken folgendermaĂen aus:
{
"sub": "lab_technician",
"scope": "user/Patient.rs
user/Observation.rs?category=laboratory&status=final",
"atv": "2"
}
Schritt 4: Aidbox fĂŒr die automatische Durchsetzung konfigurieren
Dies ist der eleganteste Teil: Aidbox setzt die im Token definierten Zugriffsregeln automatisch durch. Alles, was Sie benötigen, ist:
- TokenIntrospector â ĂberprĂŒft, ob das Token gĂŒltig und von Ihrer Keycloak-Instanz ausgestellt wurde:
{
"resourceType": "TokenIntrospector",
"jwt": {
"iss": "http://localhost:8888/realms/master"
},
"type": "jwt",
"jwks_uri":
"http://keycloak:8888/realms/master/protocol/openid-connect/certs",
"id": "external-auth-server",
"resourceType": "TokenIntrospector"
}
- AccessPolicy â Erlaubt Anfragen mit validierten Token:
{
"resourceType": "AccessPolicy",
"id": "keycloak-access-policy",
"engine": "matcho",
"matcho": {
"jwt": {
"iss": "http://localhost:8888/realms/master"
}
}
}
Das ist alles. Wenn Aidbox eine Anfrage mit einem Token empfÀngt, das atv: "2" und SMART-Scopes enthÀlt, wird automatisch:
- Die Scopes analysiert, um erlaubte Ressourcentypen zu bestimmen
- Abfrageparameter-Filter aus den Scopes angewendet
- Nur Daten zurĂŒckgegeben, die den Scope-EinschrĂ€nkungen entsprechen
- Anfragen fĂŒr nicht autorisierte Ressourcentypen abgelehnt
Kein benutzerdefinierter Autorisierungscode. Keine komplexe Zugriffskontrolllogik. Es funktioniert einfach.
Praxisbeispiel
Gehen wir beide Benutzerszenarien durch, um zu sehen, wie derselbe API-Aufruf unterschiedliche Ergebnisse liefert. Stellen Sie sich vor, Sie haben Ihr System mit Aidbox, verbunden mit Keycloak, eingerichtet, und sowohl Dr. Sarah (die Ărztin) als auch Mike (der Labortechniker) nutzen dieselbe Anwendung.
Im System gibt es zwei Observation-Ressourcen:
- HĂ€moglobin â eine Laborbeobachtung mit dem Status âfinal"
- Blutdruck â eine Vitalzeichen-Beobachtung
Beide Benutzer greifen auf denselben Endpunkt zu: GET /fhir/Observation
Aber Aidbox gibt je nach anfragender Person unterschiedliche Antworten zurĂŒck.
Test 1: Ărztlicher Zugriff (Vollzugriff)
Anmeldedaten:
Username: physician
Password: password
API-Aufruf:
GET /fhir/Observation
Authorization: Bearer <physician_token>
Token-Scopes:
user/Patient.rs user/Encounter.rs user/Observation.rs
Ergebnis: Die Ărztin sieht beide Observations:
- HĂ€moglobin (Labor, final)
- Blutdruck (Vitalzeichen)
Der Scope user/Observation.rs gewÀhrt uneingeschrÀnkten Zugriff auf alle Observation-Ressourcen.
Test 2: Zugriff des Labortechnikers (eingeschrÀnkter Zugriff)
Anmeldedaten:
Username: lab_technician
Password: password
API-Aufruf:
GET /fhir/Observation
Authorization: Bearer <lab_technician_token>
Token-Scopes:
user/Patient.rs
user/Observation.rs?category=laboratory&status=final
Ergebnis: Der Labortechniker sieht nur eine Observation:
- HĂ€moglobin (Labor, final)
Die Blutdruck-Observation wird herausgefiltert, da sie nicht den Scope-Anforderungen entspricht:
- Ihre Kategorie ist âvital-signs" (nicht âlaboratory")
- Der Scope erfordert ausdrĂŒcklich
category=laboratory&status=final
Gleicher Endpunkt, gleicher Code, unterschiedliche Ergebnisse je nach anfragender Person. Keine benutzerdefinierte Filterlogik erforderlich.
Selbst ausprobieren
Möchten Sie dies in der Praxis sehen? Das vollstĂ€ndige Beispiel ist bereit, mit Docker ausgefĂŒhrt zu werden.
Voraussetzungen: Docker und Docker Compose mĂŒssen installiert sein
Schnellstart:
- Klonen Sie das Repository und navigieren Sie zum Beispiel:
cd aidbox-features/smart-keycloak-roles
- Starten Sie alle Dienste:
docker compose up --build
-
Aidbox initialisieren: Navigieren Sie zu http://localhost:8080 und schlieĂen Sie die Aidbox-Initialisierung ab.
-
Demo-Anwendung öffnen: Navigieren Sie zu http://localhost:3000.
-
Beide Benutzerrollen testen:
Melden Sie sich als physician/password an â sehen Sie alle Observations
- Klicken Sie auf âStart Over" und melden Sie sich als
lab_technician/passwordan â sehen Sie nur Laborbefunde
Die Demo-Anwendung zeigt nebeneinander, auf was jeder Benutzer zugreifen kann, und macht die Unterschiede in der Zugriffskontrolle unmittelbar sichtbar.
Wesentliche Erkenntnisse
Dieser Ansatz bietet mehrere bedeutende Vorteile:
1. Kein benutzerdefinierter Autorisierungscode Ihre Anwendung muss Rollen weder verstehen noch Filterlogik implementieren. Aidbox erledigt dies automatisch auf Basis von SMART-Scopes.
2. Zentrale Zugriffskontrolle Alle Rollendefinitionen befinden sich in Ihrem Identity Provider (Keycloak). Ăndern Sie die Berechtigungen einer Rolle an einer Stelle, und die Ănderung gilt ĂŒberall.
3. Standardbasiert Basiert auf SMART on FHIR V2, einem etablierten Standard fĂŒr die InteroperabilitĂ€t im Gesundheitswesen. Keine proprietĂ€ren Lösungen oder Vendor-Lock-in.
4. Feingranulare Kontrolle Abfrageparameter-EinschrÀnkungen (?category=laboratory&status=final) ermöglichen prÀzise Zugriffskontrolle ohne komplexe benutzerdefinierte Regeln.
5. Einfach erweiterbar Benötigen Sie eine neue Rolle? Erstellen Sie in Keycloak eine Composite-Rolle, die die entsprechenden Basisrollen kombiniert. Keine CodeÀnderungen erforderlich.
Weitere Informationen:
Fazit
Feingranulare Zugriffskontrolle fĂŒr FHIR-Ressourcen muss nicht kompliziert sein. Durch die Kombination von SMART on FHIR V2-Scopes, dem Composite-Rollen-System von Keycloak und der automatischen Scope-Durchsetzung durch Aidbox können Sie eine ausgefeilte RBAC implementieren, ohne benutzerdefinierten Autorisierungscode zu schreiben.
Das Ergebnis: sicherere Anwendungen, einfachere Wartung und bessere Ausrichtung an Healthcare-InteroperabilitÀtsstandards.
Sind Sie bereit, rollenbasierte Zugriffskontrolle in Ihrer FHIR-Anwendung zu implementieren? Starten Sie mit dem Beispiel-Repository und passen Sie die Rollen an Ihren spezifischen Anwendungsfall an.




