

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Contoh 4: Kontrol akses multi-tenant dengan RBAC dan ABAC
<a name="avp-mt-abac-rbac-examples"></a>

Untuk menyempurnakan contoh RBAC di bagian sebelumnya, Anda dapat menambahkan atribut ke pengguna untuk membuat pendekatan hybrid RBAC-ABAC untuk kontrol akses multi-tenant. Contoh ini mencakup peran yang sama dari contoh sebelumnya, tetapi menambahkan atribut pengguna `account_lockout_flag` dan parameter konteks`uses_mfa`. Contoh ini juga mengambil pendekatan yang berbeda untuk menerapkan kontrol akses multi-penyewa dengan menggunakan RBAC dan ABAC, dan menggunakan satu penyimpanan kebijakan bersama alih-alih penyimpanan kebijakan yang berbeda untuk setiap penyewa. 

![Contoh kontrol akses multi-penyewa dengan RBAC, ABAC, Izin Terverifikasi Amazon, dan Cedar](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/saas-multitenant-api-access-authorization/images/avp-example-4.png)


Contoh ini mewakili solusi SaaS multi-penyewa di mana Anda perlu memberikan keputusan otorisasi untuk Penyewa A dan Penyewa B, mirip dengan contoh sebelumnya.

Untuk mengimplementasikan fitur kunci pengguna, contoh menambahkan atribut `account_lockout_flag` ke prinsipal `User` entitas dalam permintaan otorisasi. Bendera ini mengunci akses pengguna ke sistem dan akan `DENY` semua hak istimewa bagi pengguna yang terkunci. `account_lockout_flag`Atribut dikaitkan dengan `User` entitas dan berlaku untuk `User` sampai flag dicabut secara aktif di beberapa sesi. Contoh menggunakan `when` kondisi untuk mengevaluasi`account_lockout_flag`.

Contoh ini juga menambahkan detail tentang permintaan dan sesi. Informasi konteks menentukan bahwa sesi telah diautentikasi dengan menggunakan otentikasi multi-faktor. Untuk mengimplementasikan validasi ini, contoh menggunakan `when` kondisi untuk mengevaluasi `uses_mfa` bendera sebagai bagian dari bidang konteks. Untuk informasi selengkapnya tentang praktik terbaik untuk menambahkan konteks, lihat [dokumentasi Cedar](https://docs.cedarpolicy.com/auth/entities-syntax.html).

```
permit (
    principal in MultitenantApp::Role::"allAccessRole",
    action in [
        MultitenantApp::Action::"viewData",
        MultitenantApp::Action::"updateData"
    ],
    resource
)
when {
    principal.account_lockout_flag == false &&
    context.uses_mfa == true &&
    resource in principal.Tenant
};
```

Kebijakan ini mencegah akses ke sumber daya kecuali sumber daya berada dalam grup yang sama dengan `Tenant` atribut prinsipal yang meminta. Pendekatan untuk mempertahankan isolasi penyewa ini disebut sebagai pendekatan *One Shared Multi-Tenant Policy Store*. Untuk informasi selengkapnya tentang pertimbangan desain Izin Terverifikasi untuk aplikasi SaaS multi-penyewa, lihat [bagian pertimbangan desain multi-penyewa Izin Terverifikasi](avp-design-considerations.md).

Kebijakan ini juga memastikan bahwa kepala sekolah adalah anggota `allAccessRole` dan membatasi tindakan untuk `viewData` dan`updateData`. Selain itu, kebijakan ini memverifikasi `account_lockout_flag` itu `false` dan bahwa nilai konteks untuk `uses_mfa` mengevaluasi. `true`

Demikian pula, kebijakan berikut memastikan bahwa prinsipal dan sumber daya terkait dengan penyewa yang sama, yang mencegah akses lintas penyewa. Kebijakan ini juga memastikan bahwa kepala sekolah adalah anggota `viewDataRole` dan membatasi tindakan untuk`viewData`. Selain itu, ini memverifikasi bahwa `account_lockout_flag` adalah `false` dan bahwa nilai konteks untuk `uses_mfa` dievaluasi. `true`

```
permit (
    principal in MultitenantApp::Role::"viewDataRole",
    action == MultitenantApp::Action::"viewData",
    resource
)
when {
    principal.account_lockout_flag == false &&
    context.uses_mfa == true &&
    resource in principal.Tenant
};
```

Kebijakan ketiga mirip dengan yang sebelumnya. Kebijakan mengharuskan sumber daya untuk menjadi anggota grup yang sesuai dengan entitas yang diwakili oleh`principal.Tenant`. Ini memastikan bahwa prinsipal dan sumber daya terkait dengan Penyewa B, yang mencegah akses lintas penyewa. Kebijakan ini memastikan bahwa kepala sekolah adalah anggota `updateDataRole` dan membatasi tindakan untuk`updateData`. Selain itu, kebijakan ini memverifikasi bahwa `account_lockout_flag` adalah `false` dan bahwa nilai konteks untuk `uses_mfa` dievaluasi. `true`

```
permit (
    principal in MultitenantApp::Role::"updateDataRole",
    action == MultitenantApp::Action::"updateData",
    resource
)
when {
    principal.account_lockout_flag == false &&
    context.uses_mfa == true &&
    resource in principal.Tenant
};
```

Permintaan otorisasi berikut dievaluasi oleh tiga kebijakan yang dibahas sebelumnya di bagian ini. Dalam permintaan otorisasi ini, kepala sekolah tipe `User` dan dengan nilai `Alice` membuat `updateData` permintaan dengan peran `allAccessRole` tersebut. `Alice`memiliki atribut `Tenant` yang nilainya`Tenant::"TenantA"`. Tindakan `Alice` yang coba dilakukan adalah `updateData,` dan sumber daya yang akan diterapkan adalah `SampleData` dari jenisnya`Data`. `SampleData`memiliki `TenantA` sebagai entitas induk. 

Menurut kebijakan pertama di toko `<DATAMICROSERVICE_POLICYSTOREID>` kebijakan, `Alice` dapat melakukan `updateData` tindakan pada sumber daya, dengan asumsi bahwa kondisi dalam `when` klausul kebijakan terpenuhi. Kondisi pertama membutuhkan `principal.Tenant` atribut untuk dievaluasi`TenantA`. Kondisi kedua membutuhkan atribut kepala sekolah `account_lockout_flag` untuk menjadi`false`. Kondisi akhir membutuhkan konteksnya `uses_mfa``true`. Karena ketiga kondisi terpenuhi, permintaan mengembalikan `ALLOW` keputusan.

```
{
  "policyStoreId": "DATAMICROSERVICE_POLICYSTORE",
  "principal": {
      "entityType": "MultitenantApp::User",
      "entityId": "Alice"
  },
  "action": {
      "actionType": "MultitenantApp::Action",
      "actionId": "updateData"
  },
  "resource": {
      "entityType": "MultitenantApp::Data",
      "entityId": "SampleData"
  },
  "context": {
    "contextMap": {
        "uses_mfa": {
            "boolean": true
        }
    }
  },
  "entities": {
    "entityList": [
      {
        "identifier": {
            "entityType": "MultitenantApp::User",
            "entityId": "Alice"
        },
        "attributes": {
            {
                "account_lockout_flag": {
                    "boolean": false
                },
                "Tenant": {
                   "entityIdentifier": {
                        "entityType":"MultitenantApp::Tenant",
                        "entityId":"TenantA"
                   }
                }
            }
        },
        "parents": [
            {
                "entityType": "MultitenantApp::Role",
                "entityId": "allAccessRole"
            }
        ]
        },
     {
        "identifier": {
            "entityType": "MultitenantApp::Data",
            "entityId": "SampleData"
        },
        "attributes": {},
        "parents": [
            {
                "entityType": "MultitenantApp::Tenant",
                "entityId": "TenantA"
            }
        ]
      }
    ]
  }
}
```