---
description: Access policies examples
---
# Access policies examples
This guide provides examples of access policies for different use cases. Each example includes:
* A description of the use case
* The policy itself
* A sample request for testing in Dev Tool
See also:
* [Access Policies](../../access-control/authorization/access-policies.md)
* [Access Policy Dev Tool](access-policy-dev-tool.md)
* [Access Policies Best Practices](accesspolicy-best-practices.md)
* [Matcho DSL Reference](../../reference/matcho-dsl-reference.md)
## 1. Policy that **temporarily** allows all requests
**Description:** We need to allow all requests for testing purposes.
{% hint style="warning" %}
Never use this policy in production.
{% endhint %}
**Policy:**
```yaml
id: allow-all
resourceType: AccessPolicy
engine: allow
```
**Request to test the policy:**
```http
GET /fhir/Patient
```
## 2. Policy that allows a user to view their own patient
**Description:** User is registered in Aidbox as a `User` resource with patient id stored in `User.fhirUser` element. We want to allow the user to view their own patient data
**Policy:**
```yaml
id: as-patient-get-patient-data
resourceType: AccessPolicy
engine: matcho
link:
- reference: Operation/FhirRead
description: Policy that allows a patient to view their own patient data
matcho:
params:
resource/id: .user.fhirUser.id
resource/type: Patient
```
**Request to test the policy:**
```http
GET /fhir/Patient/123
```
## 3. Policy that allows a practitioner to view all observations
**Description:** User is registered in Aidbox as a `User` resource. A `Role` resource is assigned to the user, that links to the `Practitioner` instance:
```yaml
name: practitioner-1
resourceType: Role
user:
reference: User/user-1
links:
practitioner:
reference: Practitioner/pr-1
```
We want to allow the practitioner to view all observations.
**Policy:**
```yaml
id: as-practitioner-get-all-observations
resourceType: AccessPolicy
link:
- reference: Operation/FhirSearch
engine: matcho
matcho:
session:
role:
$contains:
links:
practitioner: present?
```
**Request to test the policy:**
```http
GET /fhir/Observation
```
## 4. Policy that allows a system to update their patients
**Description:** We have a couple of systems. Each system maintains their own patients with identifiers. We want to allow these systems to update their patients - patients that have identifiers from their own system. There's a Client resource in Aidbox created for each system.
**Policy:**
```yaml
id: as-system1-app-update-patients
resourceType: AccessPolicy
engine: matcho
link:
- reference: Operation/FhirConditionalUpdate
- reference: Client/system1-client
description: Policy that allows a system1 to update their patients
matcho:
params:
resource/type: Patient
identifier: "#http://system1"
resource:
identifier:
$contains:
system: http://system1
```
**Request to test the policy:**
```http
PUT /fhir/Patient/123
Authorization: Basic # Base64 encoded client-id and client-secret
content-type: text/yaml
accept: text/yaml
resourceType: Patient
id: 123
identifier:
- system: http://system1
value: 12345
name:
- use: official
family: Doe
given:
- John
gender: male
birthDate: 1980-01-01
```
## 5. Policy that allows a system to search for their patients
**Description:** We have a couple of systems. Each system maintains their own patients with identifiers. We want to allow these systems to get their patients - patients that have identifiers from their own system.
**Policy:**
```yaml
id: as-system1-app-read-patients
resourceType: AccessPolicy
engine: matcho
link:
- reference: Operation/FhirSearch
- reference: Client/system1-client
description: Policy that allows a system1 to search for their patients
matcho:
params:
resource/type: Patient
identifier: "#http://system1"
```
**Request to test the policy:**
```http
GET /fhir/Patient?id=123&identifier=http://system1|123
Authorization: Basic # Base64 encoded client-id and client-secret
```
## 6. Policy that allows an application to do CRUD on Patient and Practitioner resources.
**Description:** We have an application that is registered as a Client resource with id `client-id` in Aidbox. We want to allow this application to do CRUD on Patient and Practitioner resources.
**Policy:**
```yaml
id: as-client-id-crud-patients-and-practitioners
resourceType: AccessPolicy
engine: matcho
link:
- reference: Client/client-id
description: Policy that allows a client-id to do CRUD on Patient and Practitioner resources
matcho:
params:
resource/type:
$enum:
- Patient
- Practitioner
request-method:
$enum:
- get
- post
- patch
- put
```
**Request to test the policy:**
```http
GET /fhir/Patient
Authorization: Basic # Base64 encoded client-id and client-secret
```
## 7. Policy that allows an admin access to Aidbox UI to the admin users
**Description:** We have integration with external identity provider configured in Aidbox. We want to users with the role `Aidbox-Admins` to access Aidbox UI.
**Policy:**
```yaml
id: as-admin-allowed-access-to-aidbox-ui
resourceType: AccessPolicy
engine: matcho
description: Policy that allows admin access to Aidbox UI for admin users
matcho:
user:
data:
groups:
$contains: Aidbox-Admins
request-method:
$enum:
- get
- post
- put
- delete
```
**See also:**
* [Managing Admin Access to the Aidbox UI Using Okta Groups](managing-admin-access-to-the-aidbox-ui-using-okta-groups.md)
## 8. Policy that allows access to Workflow Engine screen only for a specific engineer
**Description:** We want to grant a specific engineer (identified by email) access to only the Workflow Engine screen in Aidbox UI. This policy restricts access to the `/rpc` endpoint with specific limitations on the `_m` parameter values, allowing only workflow-related operations.
**Policy:**
```yaml
id: as-engineer-allowed-to-access-workflow-engine
resourceType: AccessPolicy
engine: matcho
link:
- reference: Operation/rpc
description: Policy that allows access to Workflow Engine screen only for a John Doe engineer
matcho:
user:
data:
email: john.doe@example.com
params:
_m:
$enum:
- awf.workflow/list
- awf.task/list
- awf.task/status
- awf.workflow/status
```
## 9. Policy that allows graphql search requests to the Patient resource
**Description:** We want to allow an application, registered as a Client resource in Aidbox, to search the Patient resource using GraphQL. [GraphQL Access Control mode](../../reference/all-settings.md#module.graphql.access-control) is set to `rest-search`.
```yaml
BOX_FEATURES_GRAPHQL_ACCESS__CONTROL=rest-search
```
**Policy:**
```yaml
id: as-client-allowed-graphql-search-patients
resourceType: AccessPolicy
engine: matcho
link:
- reference: Client/my-client
description: Policy that allows graphql search requests to the Patient resource for my-client client
matcho:
request-method: get
uri: /Patient
```
**Request to test the policy:**
```graphql
query { PatientList(_count: 1) { id } }
```
## 10. Organization-based hierarchical access control policy for a end-user
**Description:** This example allows an org-based user (created by `PUT /Organization//fhir/User`) to see patients that are also created in the same organization.
**Policy:**
```yaml
id: as-user-allowed-to-see-patients-in-organization
resourceType: AccessPolicy
engine: matcho
link:
- reference: Operation/FhirSearch
description: A user should be able to get every patient in their organization.
matcho:
params:
resource/type: Patient
request-method: get
user:
meta:
extension:
$contains:
url: https://aidbox.app/tenant-organization-id
value:
Reference:
id: .params.organization/id
```
**Request to test the policy:**
```http
GET /Organization/org-a/fhir/Patient/pt-1
```
**See also:**
* [Organization-based hierarchical access control](../../access-control/authorization/scoped-api/organization-based-hierarchical-access-control.md)
## 11. Policy that allows all the requests with JWT issued by certain issuer
**Description:** [Token introspector](set-up-token-introspection.md) is configured in Aidbox to trust JWT issued by certain issuer - `https://auth.example.com`. We want to allow all the requests with JWT issued by this issuer.
**Policy:**
```yaml
id: jwt-issued-by-auth-example-com-allowed
resourceType: AccessPolicy
engine: matcho
description: Policy that allows all the requests with JWT issued by certain issuer
matcho:
jwt:
iss: https://auth.example.com
```
**Request to test the policy:**
```http
GET /fhir/Patient
Authorization: Bearer
```
## 12. Policy that allows the practitioner to read their patients
**Description:** Practitioner is registered in Aidbox as a `User` resource with practitioner id stored in `User.data.practitioner_id` element. We want to allow the practitioner to read their patients.
**Policy:**
```yaml
id: as-practitioner-allowed-to-see-his-patients
resourceType: AccessPolicy
engine: matcho
link:
- reference: Operation/FhirSearch
description: Policy that allows the practitioner to read their patients
matcho:
params:
# Only for Patient resources
resource/type: Patient
# query parameter general-practitioner should be equal to user.data.practitioner_id
general-practitioner: .user.data.practitioner_id
user:
# user.data.practitioner_id should be present
data:
practitioner_id: present?
```
**Request to test the policy:**
```http
GET /fhir/Patient?general-practitioner=pr-1
```
## 13. Policy that allows the practitioner to read patients based on given consent.
**Description:** Consent is stored in Aidbox as a `Consent` resource, with practitioner id stored in `Consent.actor` element. Practitioner is registered in Aidbox as a `User` resource with practitioner id stored in `User.data.practitioner_id` element. We want to allow the practitioner to read patients based on given consent.
**Policy:**
```yaml
id: as-practitioner-allowed-to-read-patients-with-consent
resourceType: AccessPolicy
engine: matcho
link:
- reference: Operation/FhirSearch
description: Policy that allows the practitioner to read patients based on given consent
matcho:
user: present?
params:
_has:Consent:patient:actor: .user.fhirUser.id
_has:Consent:patient:scope: Encounter
_revinclude: Encounter:subject
request-method: get
```
**Request to test the policy:**
```http
GET /fhir/Patient?_has:Consent:patient:actor=
```
## 14. Policy that allows the practitioner to create Observations for their patients
**Description:** Practitioner is registered in Aidbox as a `User` resource with practitioner id stored in `User.data.practitioner_id` element. We want to allow the practitioner to create observations for their patients. The relation between the practitioner and the patient is stored in `Patient.generalPractitioner` element.
**Policy:**
```yaml
id: as-practitioner-allowed-to-create-observations-for-their-patients
resourceType: AccessPolicy
engine: complex
link:
- reference: Operation/FhirCreate
description: Allow practitioner to create observations for their patients
and:
- engine: matcho
matcho:
params:
resource/type: Observation
user: present?
user:
data:
practitioner_id: present?
- engine: sql
sql:
query: |-
SELECT
EXISTS (
SELECT 1 FROM patient p
WHERE p.id = split_part(({{resource.subject.reference}})::text, '/',2)
AND p.resource->'generalPractitioner' @>
jsonb_build_array(
jsonb_build_object(
'resourceType', 'Practitioner',
'id', {{user.data.practitioner_id}}::text
)
)
);
```
**Request to test the policy:**
```http
POST /fhir/Observation
Content-Type: text/yaml
Accept: text/yaml
resourceType: Observation
status: final
code:
coding:
- system: http://loinc.org
code: "29463-7"
display: Body Weight
subject:
reference: Patient/pt-2
effectiveDateTime: "2025-09-08T10:00:00Z"
valueQuantity:
value: 72
unit: kg
system: http://unitsofmeasure.org
code: kg
```
## 15. Policy that denies a system to update "protected" resources
**Description:** We have a system that is registered as a `Client` resource in Aidbox. We want to allow this system to update all the Practitioner resources except the ones with `meta.source` equal to `MDM`.
**Policy:**
```yaml
id: as-system-allowed-to-update-practitioners-except-mdm
resourceType: AccessPolicy
engine: complex
link:
- reference: Operation/FhirUpdate
description: Allow practitioner to create observations for their patients
and:
- engine: matcho
matcho:
params:
resource/type: Practitioner
- engine: sql
sql:
query: |-
SELECT resource -> 'meta' ->> 'source' IS NULL OR resource -> 'meta' ->> 'source' != 'MDM' FROM practitioner WHERE id = {{params.resource/id}};
```
**Request to test the policy:**
```http
PUT /fhir/Practitioner/pr-1
Authorization: Basic # Base64 encoded client-id and client-secret
{
"name": [
{
"given": [
"John"
]
}
]
}
```
## 16. Policy that allows only read operations to $sql endpoint
**Description:** This policy restricts access to the $sql endpoint by allowing only read-only SQL queries (such as `SELECT`). Any write or schema-modifying operations (`INSERT`, `UPDATE`, `DELETE`, `CREATE`, etc.) are explicitly denied, ensuring that the endpoint can be used safely for querying data without risk of altering the database.
**Policy:**
```yaml
link:
- reference: User/ca57d5ad-22de-4cce-aaba-b5d6c50a88e8
engine: matcho
matcho:
uri: /$sql
body:
sql: "#^(?i)(?!.*(INSERT|UPDATE|DELETE|MERGE|COPY|CREATE|ALTER|DROP|GRANT|REVOKE|TRUNCATE|CALL|DO|COMMENT|VACUUM|ANALYZE)).*"
request-method: post
```
## 17. Policy that allows using their own compartment for patients
**Description:** Given that each patient has an external identifier corresponding to a user ID from an external Identity Provider (`jwt.IDP-UserId`), we want to enforce a policy that allows each user to access only the resources within their own compartment.
**Policy:**
```yaml
engine: complex
description: Allow member to use correct patient compartment
id: as-member-allowed-to-use-thier-own-compartment
link:
- reference: Operation/FhirCompartmentSearch
and:
- engine: matcho
matcho:
jwt:
IDP-UserId: present?
params:
resource/type: Patient
- engine: sql
sql:
query: |-
SELECT p.id = ({{params.resource/id}})::text FROM patient p
WHERE p.resource->'identifier' @>
jsonb_build_array(
jsonb_build_object(
'system', 'https://IDP',
'value', {{jwt.IDP-UserId}}::text
)
);
```
**Request to test the policy:**
```http
GET /fhir/Patient//Observation
```