...
The RBAC part of the access control is based on the user’s list of process privileges contained in the access token.
Access Token Field | Meaning | Example Value |
---|---|---|
realm_access | List of process privileges, that is, what is the user allowed to do. | "realm_access": { "roles": [ "Patient.read", "Patient.write" ] } |
What operations the user is allowed to invoke is stated in the "realm_access" attribute. In the example above the user is allowed to issue a "Patient.read" and a "Patient.write". This means that the user can get and edit patient records. This part of the security model is the RBAC-part, as the claims here are entirely based upon what role the user has.
...
The ABAC part of the access control combines the access token user type with security token context(s) and, at times, also the access token user id. These are typically compared to attributes of the data from the services.
Access Token Field | Meaning | Example Value |
---|---|---|
context | List of items that are set in context. context in combination with items in realm_access governs the access to all resources in the ehealth infrastructure. | "context": { "organization_id" : "https://fut.com/fhir/Organization/1", "care_team_id": https://fut.com/fhir/CareTeam/4, "episode_of_care_id": https://fut.com/fhir/EpisodeOfCare/10, "patient_id": "https://fut.com/fhir/Patient/8" } |
user_id | Id of the user. Can be either a FHIR patient Id, FHIR practitioner Id or a KeyCloak Id | "user_id": " e03ccef7-b0b1-4f68-8e16-6fc2f865a922" |
user_type | Can be either SYSTEM, PATIENT, PRACTITIONER or SSL | "user_type": "PATIENT" |
Each resource type (see IG Profiles) has certain restrictions to what context is required in order to allow data retrieval or data manipulation.
...
These resources are not patient related. Read and Search operations do not require any security context apart from the privilege.
Plandefinition/ActivityDefinition | |||
User Type | FHIR Operation | Organization Context | Property updated → role needed |
---|---|---|---|
Practitioner | create/update | required: must match modifierRole.reference | PlanDefinition/ActivityDefinition creation or modifierRole changed → owner All other updates → owner or co-author |
System | - | - | - |
Plandefinition$apply | |||
User Type | EpisodeOfCare Context | CareTeam Context | |
---|---|---|---|
Practitioner | required: Must match EpisodeOfCare.id | required: Must match EpisodeOfCare.team | |
System | - | - |
DocumentReference
These resources are not patient related.
DocumentReference.read/search | |
User Type | Context |
---|---|
Practitioner / Patient | - |
System | - |
Read and Search operations do not require any security context apart from the privilege.
DocumentReference.create/update | |
User Type | Organization Context |
---|---|
Practitioner / Patient | required: must match DocumentReference.custodian |
System | - |
EpisodeOfCare/Condition/Provenance/Consent
EpisodeOfCare cannot be created directly. They are created by calling the custom operation: create-episode-of-care
EpisodeOfCare.create-episode-of-care | |||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context |
---|---|---|---|
Practitioner | must not be present | required: must match EpisodeOfCare.Patient | required: Must match EpisodeOfCare.team |
Patient | must not be present | required: must match EpisodeOfCare.Patient | - |
System | - | - | - |
EpisodeOfCare.read | |
User Type | EpisodeOfCare Context |
---|---|
Practitioner/Patient | required: must match EpisodeOfCare |
System | - |
EpisodeOfCare.patch/updateCareteams | ||
User Type | EpisodeOfCare Context | CareTeam Context |
---|---|---|
Practitioner | required: must match EpisodeOfCare | required: Must match EpisodeOfCare.team |
Patient | required: must match EpisodeOfCare | - |
System | - | - |
EpisodeOfCare.search | |||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context |
---|---|---|---|
Practitioner | must not be present | optional but when present: must match Patient search parameter | required: Must match CareTeam search parameter |
Patient | must not be present | Always present: must match Patient search parameter |
|
System | - | - | - |
Condition | |||
User Type | EpisodeOfCare Context | CareTeam Context | |
---|---|---|---|
Practitioner | required: must match Condition.context | - | |
Patient | required: must match Condition.context | - | |
System | - | - |
Provenance.read | |||
User Type | EpisodeOfCare Context | CareTeam Context | |
---|---|---|---|
Practitioner | required: must match Provenance.target | - | |
Patient | required: must match Provenance.target | - | |
System | - | - |
Provenance.search | |||
User Type | EpisodeOfCare Context | CareTeam Context | |
---|---|---|---|
Practitioner | required: must match EpisodeOfCare search parameter (provenance.target) | - | |
Patient | required: must match EpisodeOfCare search parameter (provenance.target) | - | |
System | - | - |
Consent.create/read/patch | ||
User Type | EpisodeOfCare Context | CareTeam Context |
---|---|---|
Practitioner | Required Must match data.reference | - |
Patient | Required Must match data.reference | - |
System | - | - |
Consent.search | ||
User Type | EpisodeOfCare Context | CareTeam Context |
---|---|---|
Practitioner | required: must match EpisodeOfCare search parameter (consent.data.reference) | - |
Patient | required: must match EpisodeOfCare search parameter (consent.data.reference) | - |
System | - | - |
CarePlan/ProcedureRequest
...
CarePlans cannot be created directly. They are created and assigned to a patient by calling PlanDefinition$apply
CarePlan/ProcedureRequest Read/Suggest-care-teams | |||
User Type | EpisodeOfCare Context | CareTeam Context | |
---|---|---|---|
Practitioner | required: must match CarePlan/ProcedureRequest.context | required: Careplan: Context must match CarePlan.careTeam or Careplan.context.team ProducereRequest: Context must match CarePlan.careTeam or Careplan.context.team for the CarePlan that the ProcedureRequest belongs to. | |
Patient | required: must match CarePlan/ProcedureRequest.context |
| |
System | - | - |
CarePlan/ProcedureRequest Update/Update-care-teams | ||||
User Type | EpisodeOfCare Context | CareTeam Context | Extra permission | |
---|---|---|---|---|
Practitioner | required: must match CarePlan/ProcedureRequest.context | required: Careplan: Context must match CarePlan.careTeam or CarePlan.context.team ProducereRequest: Context must match CarePlan.careTeam or CarePlan.context.team for the CarePlan that the ProcedureRequest belongs to. | ||
Patient | required: must match CarePlan/ProcedureRequest.context | - | Only allowed if definition.topic is 'self-treatment' | |
System | - | - |
CarePlan: Update careteam special case | ||||
User Type | EpisodeOfCare Context | CareTeam Context | Extra permission | |
---|---|---|---|---|
Practitioner | required: must match CarePlan.context | required: Must match CarePlan.careTeam | Careplan$update.responsibility permission required in token to update careteam element | |
CarePlan Search | |||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context |
---|---|---|---|
Practitioner | optional but when present: must match searchparam theContext | optional but when present: must match searchparam theSubject Only checked if EpisodeOfCare Context is not set. | required: Must match search parameter CarePlan.careteam or CarePlan.context.team. (Only a single search parameter is allowed for this element) |
Patient | optional but when present: must match searchparam theContext | Always present and must match searchparam theSubject Only checked if EpisodeOfCare Context is not set. | - |
System | - | - | - |
Goal
Goals are considered as part of a CarePlan and do not have separate privileges.
Goal Create/Read/Update | ||||
User Type | Patient Context | EpisodeOfCare Context | CareTeam Context | |
---|---|---|---|---|
Practitioner | - | required: must match Goal.addresses.context | required: must match Goal.addresses.context.team or Careplan.careteam for the CarePlan that the Goal.addresses ProcedureRequest belongs to. | |
Patient | required: Must match Goal.subject | - | - | |
System | - | - | - |
Goal Search | ||||
User Type | Patient Context | EpisodeOfCare Context | CareTeam Context | |
---|---|---|---|---|
Practitioner | - | required: must match search param: addresses.context | required: must match search param addresses.context.team or Careplan.careteam for the CarePlan that the addresses ProcedureRequest belongs to. | |
Patient | required: Must match search param addresses.subject | - | - | |
System | - | - | - |
CommunicationRequest
CommunicationRequest Create/Read/Update/Delete | ||||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context | Details |
---|---|---|---|---|
Practitioner | required must match CommunicationRequest.context | not checked | required must match CommunicationRequest.recipient if recipient contains a careteam | |
Patient | optional but when present: must match CommunicationRequest.context | required must match CommunicationRequest.recipient | - | Update: Only status |
System | - | - |
CommunicationRequest Search | ||||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context | |
---|---|---|---|---|
Practitioner | required if searchparam recipient is a patient. optional otherwise. must match searchparam CommunicationRequest.context when present | optional but when present: must match searchparam CommunicationRequest.subject | required if searchparam recipient is a careteam | |
Patient | optional but when present must match CommunicationRequest.context | Always present and must match searchparam CommunicationRequest.recipient | - | |
System | - | - | - |
ClinicalImpression/Task
ClinicalImpression create/read/update | ||||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context | |
---|---|---|---|---|
Practitioner | required: must match ClinicalImpression.context | - | required: must be in ClinicalImpressions.ehealth-careplan.careTeam or ClinicalImpressions.context.team | |
Patient | optional but when present: must match ClinicalImpression.context | required when EOC context not present: must match ClinicalImpression.subject | - | |
System | - | - | - |
ClinicalImpression.search | ||||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context | |
---|---|---|---|---|
Practitioner | optional but when present: must match searchparam: context | optional must match searchparam: subject Only checked if EOC context is not present: | required: Must match search param value in context.team or carePlan.careTeam | |
Patient | optional but when present: must match searchparam: context | required when EpisodeOfCare Context not present: must match searchparam: subject |
| |
System | - | - | - |
Task create/read/update | ||||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context / UserId | Extra Permission |
---|---|---|---|---|
Practitioner | optional but when present: must match Task.context | optional must match Task.context.subject Only checked if EOC context is not present: | CareTeam Context must match Task.responsible | User must have at least one corresponding restriction category privilege in Task.restriction-category. |
UserID must match Task.responsible, Task.owner or Task.requester | ||||
Patient | optional but when present: must match Task.context | required when EOC context not present: must match Task.context.subject | UserID must match Task.responsible, Task.owner or Task.requester | |
System | - | - | - |
Task search | ||||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context / UserId | Extra Permission |
---|---|---|---|---|
Practitioner | optional but when present: must match searchparam Context | optional must match searchparam Context.subject Only checked if EOC context is not present: | CareTeam Context must match searchparam responsible | User must have all restriction category privileges corresponding to the list in searchparam restriction-category. |
UserID must match searchparam: Responsible, Owner or Requester | ||||
Patient | optional but when present: must match searchparam Context | required when EpisodeOfCare Context not present: must match searchparam theContext.subject | UserID must match searchparam: Responsible, Owner or Requester | |
System | - | - | - |
When searching for tasks based on careteam, it is possible, but not necessary to specify restriction categories. If they are not specified as search criteria, then they will be inferred from the privileges in the security-token.
...
Observation/QuestionnaireResponse/Media/Communication
Observation , QuestionnaireResponse and Media cannot be created directly. They can be created by calling $submit-measurement. QuestionnaireResponse can be created directly as drafts or as a completed QuestionnaireResponse by calling $submit-measurement
Communication read | ||||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context | |
---|---|---|---|---|
Practitioner | optional but when present: must match communication.context | required if EpisodeOfCare context not present: must match communication.subject Only checked if EpisodeOfCare Context is not present. | A match must be found either through the Careteam or the UserID
| |
Patient | - | required: must match communication.recipient or communication.sender | - | |
System | - | - | - |
Communication create/patch | ||||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context | Extra permission |
---|---|---|---|---|
Practitioner | optional but when present: must match communication.context | required if EpisodeOfCare context not present: must match communication.subject Only checked if EpisodeOfCare Context is not present. | A match must be found either through the Careteam or the UserID
| |
Patient | - | required: must match communication.subject | - | communication.sender must match AuthToken.userId |
System | - | - | - |
Communication search | |||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context |
---|---|---|---|
Practitioner | required: search param must match the context | - | A match must be found either through the Careteam or the UserID
|
Patient | - | required: context must match subject and either of sender or recipient search params | - |
System | - | - | - |
Observation read | |||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context |
---|---|---|---|
Practitioner | required: must match observation.context | -- | required: If the CareTeam is assigned on the EpisodeOfCare:
If the Careteam is assigned on the CarePlan:
|
Patient | optional but when present: must match observation.context | required when EOC context not present: must match observation.subject Only checked if EpisodeOfCare Context is not present. | -- |
System | -- | -- | -- |
Observation search | |||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context |
---|---|---|---|
Practitioner | required: search param must match the context | -- | required: If the CareTeam is assigned on the EpisodeOfCare:
If the Careteam is assigned on the CarePlan:
|
Patient | optional but when present: search param must match the context | required when EOC context not present: search param must match the context | -- |
System | -- | -- | -- |
QuestionnaireResponse read | |||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context |
---|---|---|---|
Practitioner | required: must match questionnaireResponse.context | -- | required: If the CareTeam is assigned on the EpisodeOfCare:
If the Careteam is assigned on the CarePlan:
|
Patient | optional but when present: must match questionnaireResponse.context | required when EOC context not present: must match questionnaireResponse.subject | -- |
System | -- | -- | -- |
QuestionnaireResponse search | |||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context |
---|---|---|---|
Practitioner | required: search param must match the context | -- | required: If the CareTeam is assigned on the EpisodeOfCare:
If the Careteam is assigned on the CarePlan:
|
Patient | optional but when present: search param must match the context | required when EOC context not present: search param must match the context | -- |
System | -- | -- | -- |
QuestionnaireResponse create | ||
User Type | EpisodeOfCare Context | CareTeam Context |
---|---|---|
Practitioner | required: must match questionnaireResponse.context | required: If the CareTeam is assigned on the EpisodeOfCare:
If the Careteam is assigned on the CarePlan:
|
Patient | required must match questionnaireResponse.context | -- |
System | -- | -- |
QuestionnaireResponse update | |||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context |
---|---|---|---|
Practitioner | required: must match questionnaireResponse.context | -- | required: If the CareTeam is assigned on the EpisodeOfCare:
If the Careteam is assigned on the CarePlan:
|
Patient | -- | required must match questionnaireResponse.subject | -- |
System | -- | -- | -- |
Media read | |||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context |
---|---|---|---|
Practitioner | required: must match media.context | -- | required: If the CareTeam is assigned on the EpisodeOfCare:
If the Careteam is assigned on the CarePlan:
|
Patient | optional but when present: must match media.context | required when EOC context not present: must match media.subject | -- |
System | -- | -- | -- |
Media search | |||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context |
---|---|---|---|
Practitioner | required: search param must match the context | -- | required: If the CareTeam is assigned on the EpisodeOfCare:
If the Careteam is assigned on the CarePlan:
|
Patient | optional but when present: search param must match the context | required when EOC context not present: search param must match the context | -- |
System | -- | -- | -- |
$submit-measurement | |
User Type | EpisodeOfCare Context |
---|---|
Practitioner | required |
Patient | required |
System | -- |
$search-measurements | |||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context |
---|---|---|---|
Practitioner | required: search param must match the context | -- | required: If the CareTeam is assigned on the EpisodeOfCare:
If the Careteam is assigned on the CarePlan:
|
Patient | optional but when present: search param must match the context | required when EOC context not present: search param must match the context | -- |
System | -- | -- | -- |
Organization/Practitioner/CareTeam
...
Privately owned devices do not have context checks. The tables below are valid for devices owned by organizations.
Device/DeviceMetric create/update/delete | ||
User Type | Organization Context | Patient Context |
---|---|---|
SSL supplier/Practitioner | required must match the Device.owner organization | Optional but when present: must match a DeviceUseStatement where:
|
Patient | - | must match a DeviceUseStatement where:
|
System | - |
Device read | ||
User Type | Patient Context | Organization Context |
---|---|---|
SSL supplier/Practitioner | Optional but when present: must match a DeviceUseStatement where:
| Required if patient context is not present. Must match device.owner |
Patient | must match a DeviceUseStatement where:
| - |
System | - |
DeviceUseStatement create/update | ||
User Type | Patient Context | Organization Context |
---|---|---|
SSL supplier/Practitioner | required must match DeviceUseStatement.subject | required must match the Device.owner organization |
System | - | - |
DeviceUseStatement read | ||
User Type | Patient Context | Organization Context |
---|---|---|
SSL supplier/Practitioner | required must match DeviceUseStatement.subject | - |
Patient | must match a DeviceUseStatement.subject | - |
System | - | - |
Questionnaire
Questionnaire | ||||
User Type | FHIR Operation | Organization Context | Property updated | Role needed |
---|---|---|---|---|
Practitioner / Patient | create | required: must match Questionnaire.modifierRole.reference | - | owner |
update | required: must match Questionnaire.modifierRole.reference | Questionnaire.modifierRole | owner | |
Not Questionnaire.modifierRole | owner or co-author | |||
delete | required: must match Questionnaire.modifierRole.reference | - | owner | |
read/search | - | - | - | |
System | - | - | - | - |
Transform
These operations are stateless and only require privileges to call. There are no security context requirements for these operations
...
There are no context checks for CRUD and search operations for the Library resource.
Library evaluate | |||
User Type | EpisodeOfCare Context | Patient Context | CareTeam Context |
---|---|---|---|
Practitioner | required: must match either Observation.context or QuestionnaireResponse.context | required: must match either Observation.subject or QuestionnaireResponse.subject | - |
Patient | required: must match either Observation.context or QuestionnaireResponse.context | required: must match either Observation.subject or QuestionnaireResponse.subject | - |
System | - | - | - |
SSL
SSL Catalogue
SSL Catalogue create/update/read | |
User Type | Organization Context |
---|---|
SSL supplier | required: |
Practitioner | - |
System | - |
SSL CatalogueItem
SSL CatalogueItem create/update/read | |
User Type | Organization Context |
---|---|
SSL supplier | required: |
Practitioner | - |
System | - |
SSL CatalogueItems read | |
User Type | Organization Context |
---|---|
SSL supplier | required: |
Practitioner | required: |
System | - |
SSL Annotation
SSL Annotation create/update/read/delete | |
User Type | Organization Context |
---|---|
SSL supplier | required: |
Practitioner | - |
System | - |
SSL WhiteList
SSL WhiteList create/read/delete | |
User Type | Organization Context |
---|---|
SSL supplier | - (no access) |
Practitioner | required: |
System | - |
SSL BlackList
SSL BlackList create/read/delete | |
User Type | Patient Context |
---|---|
SSL supplier | - (no access) |
Practitioner | required: |
System | - |
SSL Problem
SSL Problem create/patch/delete | |
User Type | Organization Context |
---|---|
SSL supplier | required: |
Practitioner | - (no access) |
System | - |
SSL Problem read | |
User Type | Organization Context |
---|---|
SSL supplier | required: |
Practitioner | required: |
System | - |
SSL Package
SSL Package create/read/patch/delete | |
User Type | Organization Context |
---|---|
SSL supplier | - (no access) |
Practitioner | required: must resolve to and match the Package.buyer party |
System | - |
SSL Orders
SSL Order create | |||
User Type | Organization Context | EpisodeOfCare Context | CareTeam Context |
---|---|---|---|
SSL supplier | required: | required: | required: |
Practitioner | required: | required: | required: |
System | - | - | - |
SSL Order read/update/patch/delete/search | |
User Type | Organization Context |
---|---|
SSL supplier | required: |
Practitioner | required: |
System | - |
SSL OrderLine create/read/update/patch/delete/search | |
User Type | Organization Context |
---|---|
SSL supplier | required: |
Practitioner | required: |
System | - |
SSL Contract
SSL Contract create/patch/read | |
User Type | Organization Context |
---|---|
SSL supplier | required: |
Practitioner | - |
System | - |
custom/hasValidContract | |
User Type | Organization Context |
---|---|
SSL supplier | required: |
Practitioner | - |
System | - |
SSL Party
SSL Party create/update/read | |
User Type | Organization Context |
---|---|
SSL supplier | - |
Practitioner | - |
System | - |
custom/findOrCreateParty | |
User Type | Organization Context |
---|---|
SSL supplier | required: |
Practitioner | required: |
System | - |
Reports
Schedule/Fetch <Report_name> | ||||
User Type | Organization Context | UserID | Extra permission | |
---|---|---|---|---|
Practitioner | required Must match input parameter: ManagingOrganization | Only the user that called schedule is allowed to read the resulting /fhir/Binary/id | The privilege Report.non-anonymized is required if input parameter: anonymization == false | |
System-user | System user can't have an organization context | Only the user that called schedule is allowed to read the resulting /fhir/Binary/id | The privilege Report.non-anonymized is required if input parameter: anonymization == false |
Patient/Appointment/Communication(eHealthMessage)/Person
...