

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

# Contoh 1: ABAC Dasar dengan Izin Terverifikasi dan Cedar
<a name="avp-basic-abac-examples"></a>

Dalam skenario contoh ini, Izin Terverifikasi Amazon digunakan untuk menentukan pengguna mana yang diizinkan mengakses informasi dalam layanan mikro Payroll fiksi. Bagian ini mencakup cuplikan kode Cedar untuk menunjukkan bagaimana Anda dapat menggunakan Cedar untuk membuat keputusan kontrol akses. Contoh-contoh ini tidak dimaksudkan untuk memberikan eksplorasi penuh atas kemampuan yang disediakan oleh Cedar dan Izin Terverifikasi. Untuk ikhtisar Cedar yang lebih menyeluruh, lihat dokumentasi [Cedar](https://docs.cedarpolicy.com/).

Dalam diagram berikut, kami ingin menegakkan dua aturan bisnis umum yang terkait dengan `viewSalary` `GET` metode ini: *Karyawan dapat melihat gaji mereka sendiri* dan *Karyawan dapat melihat gaji siapa saja yang melapor kepada mereka*. Anda dapat menerapkan aturan bisnis ini dengan menggunakan kebijakan Izin Terverifikasi.

![Contoh implementasi ABAC dasar dengan Izin Terverifikasi Amazon dan Cedar untuk mengimplementasikan PDP](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/saas-multitenant-api-access-authorization/images/avp-example-1.png)


*Karyawan dapat melihat gaji mereka sendiri.*

Dalam Cedar, konstruksi dasar adalah *entitas*, yang mewakili prinsip, tindakan, atau sumber daya. Untuk membuat permintaan otorisasi dan memulai evaluasi dengan kebijakan Izin Terverifikasi, Anda perlu memberikan *prinsipal,* *tindakan*, *sumber daya,* dan *daftar entitas*.
+ Principal (`principal`) adalah pengguna atau peran yang masuk.
+ Action (`action`) adalah operasi yang dievaluasi oleh permintaan.
+ Resource (`resource`) adalah komponen yang diakses oleh tindakan.
+ Daftar entitas (`entityList`) berisi semua entitas yang diperlukan untuk mengevaluasi permintaan.

Untuk memenuhi aturan bisnis *Karyawan dapat melihat gaji mereka sendiri*, Anda dapat memberikan kebijakan Izin Terverifikasi seperti berikut ini.

```
permit (
    principal,
    action == Action::"viewSalary",
    resource
)
when {
    principal == resource.owner
};
```

Kebijakan ini mengevaluasi `ALLOW` apakah `Action` is `viewSalary` dan sumber daya dalam permintaan memiliki pemilik atribut yang sama dengan prinsipal. Misalnya, jika Bob adalah pengguna yang masuk yang meminta laporan gaji dan juga pemilik laporan gaji, kebijakan akan mengevaluasi`ALLOW`.

Permintaan otorisasi berikut diserahkan ke Izin Terverifikasi untuk dievaluasi oleh kebijakan sampel. Dalam contoh ini, Bob adalah pengguna yang masuk yang membuat `viewSalary` permintaan. Oleh karena itu, Bob adalah prinsipal dari tipe entitas`Employee`. Tindakan yang coba dilakukan Bob adalah `viewSalary,` dan sumber daya yang `viewSalary` akan ditampilkan adalah `Salary-Bob` dengan jenisnya`Salary`. Untuk mengevaluasi apakah Bob dapat melihat `Salary-Bob` sumber daya, Anda perlu menyediakan struktur entitas yang menghubungkan tipe `Employee` dengan nilai `Bob` (prinsipal) ke atribut pemilik sumber daya yang memiliki tipe`Salary`. Anda menyediakan struktur ini di`entityList`, di mana atribut yang terkait dengan `Salary` menyertakan pemilik, yang menentukan `entityIdentifier` yang berisi tipe `Employee` dan nilai`Bob`. Izin Terverifikasi membandingkan yang `principal` disediakan dalam permintaan otorisasi dengan `owner` atribut yang terkait dengan `Salary` sumber daya untuk membuat keputusan.

```
{
  "policyStoreId": "PAYROLLAPP_POLICYSTOREID",
  "principal": {
    "entityType": "PayrollApp::Employee",
    "entityId": "Bob"
  },
  "action": {
    "actionType": "PayrollApp::Action",
    "actionId": "viewSalary"
  },
  "resource": {
    "entityType": "PayrollApp::Salary",
    "entityId": "Salary-Bob"
  },
  "entities": {
    "entityList": [
      {
        "identifier": {
          "entityType": "PayrollApp::Salary",
          "entityId": "Salary-Bob"
        },
        "attributes": {
          "owner": {
            "entityIdentifier": {
              "entityType": "PayrollApp::Employee",
              "entityId": "Bob"
            }
          }
        }
      },
      {
        "identifier": {
          "entityType": "PayrollApp::Employee",
          "entityId": "Bob"
        },
        "attributes": {}
      }
    ]
  }
}
```

Permintaan otorisasi untuk Izin Terverifikasi mengembalikan berikut ini sebagai output, di mana atributnya `decision` adalah salah satu atau`ALLOW`. `DENY`

```
{
    "determiningPolicies": 
        [ 
            {
                "determiningPolicyId": "PAYROLLAPP_POLICYSTOREID" 
            }
        ],
    "decision": "ALLOW",
    "errors": [] 
}
```

Dalam hal ini, karena Bob mencoba melihat gajinya sendiri, permintaan otorisasi yang dikirim ke Izin Terverifikasi mengevaluasi. `ALLOW` Namun, tujuan kami adalah menggunakan Izin Terverifikasi untuk menegakkan dua aturan bisnis. Aturan bisnis yang menyatakan hal-hal berikut juga harus benar:

*Karyawan dapat melihat gaji siapa saja yang melapor kepada mereka.*

Untuk memenuhi aturan bisnis ini, Anda dapat memberikan kebijakan lain. Kebijakan berikut mengevaluasi `ALLOW` apakah tindakan tersebut `viewSalary` dan sumber daya dalam permintaan memiliki atribut `owner.manager` yang sama dengan prinsipal. Misalnya, jika Alice adalah pengguna yang masuk yang meminta laporan gaji dan Alice adalah manajer pemilik laporan, kebijakan tersebut akan dievaluasi. `ALLOW`

```
permit (
    principal,
    action == Action::"viewSalary",
    resource
)
when {
    principal == resource.owner.manager
};
```

Permintaan otorisasi berikut diserahkan ke Izin Terverifikasi untuk dievaluasi oleh kebijakan sampel. Dalam contoh ini, Alice adalah pengguna yang masuk yang membuat `viewSalary` permintaan. Oleh karena itu Alice adalah kepala sekolah dan entitas adalah tipe`Employee`. Tindakan yang Alice coba lakukan adalah`viewSalary`, dan sumber daya yang `viewSalary` akan ditampilkan adalah tipe `Salary` dengan nilai. `Salary-Bob` Untuk mengevaluasi apakah Alice dapat melihat `Salary-Bob` sumber daya, Anda perlu menyediakan struktur entitas yang menghubungkan tipe `Employee` dengan nilai `manager` atribut, yang kemudian harus dikaitkan dengan `owner` atribut tipe `Salary` dengan nilai`Salary-Bob`. `Alice` Anda menyediakan struktur ini di`entityList`, di mana atribut yang terkait dengan `Salary` menyertakan pemilik, yang menentukan `entityIdentifier` yang berisi tipe `Employee` dan nilai`Bob`. Izin Terverifikasi terlebih dahulu memeriksa `owner` atribut, yang mengevaluasi tipe `Employee` dan nilainya. `Bob` Kemudian, Izin Terverifikasi mengevaluasi `manager` atribut yang terkait dengan `Employee` dan membandingkannya dengan prinsipal yang disediakan untuk membuat keputusan otorisasi. Dalam hal ini, keputusannya adalah `ALLOW` karena `resource.owner.manager` atribut `principal ` dan setara.

```
{
  "policyStoreId": "PAYROLLAPP_POLICYSTOREID",
  "principal": {
    "entityType": "PayrollApp::Employee",
    "entityId": "Alice"
  },
  "action": {
    "actionType": "PayrollApp::Action",
    "actionId": "viewSalary"
  },
  "resource": {
    "entityType": "PayrollApp::Salary",
    "entityId": "Salary-Bob"
  },
  "entities": {
    "entityList": [
      {
        "identifier": {
          "entityType": "PayrollApp::Employee",
          "entityId": "Alice"
        },
        "attributes": {
          "manager": {
            "entityIdentifier": {
              "entityType": "PayrollApp::Employee",
              "entityId": "None"
            }
          }
        },
        "parents": []
      },
      {
        "identifier": {
          "entityType": "PayrollApp::Salary",
          "entityId": "Salary-Bob"
        },
        "attributes": {
          "owner": {
            "entityIdentifier": {
              "entityType": "PayrollApp::Employee",
              "entityId": "Bob"
            }
          }
        },
        "parents": []
      },
      {
        "identifier": {
          "entityType": "PayrollApp::Employee",
          "entityId": "Bob"
        },
        "attributes": {
          "manager": {
            "entityIdentifier": {
              "entityType": "PayrollApp::Employee",
              "entityId": "Alice"
            }
          }
        },
       "parents": []
      }
    ]
  }
}
```

Sejauh ini dalam contoh ini, kami memberikan dua aturan bisnis yang terkait dengan `viewSalary` metode ini, *Karyawan dapat melihat gaji mereka sendiri* dan *Karyawan dapat melihat gaji siapa saja yang melapor kepada mereka*, ke Izin Terverifikasi sebagai kebijakan untuk memenuhi ketentuan masing-masing aturan bisnis secara independen. Anda juga dapat menggunakan satu kebijakan Izin Terverifikasi untuk memenuhi ketentuan kedua aturan bisnis:

*Karyawan dapat melihat gaji mereka sendiri dan gaji siapa saja yang melapor kepada mereka.*

Bila Anda menggunakan permintaan otorisasi sebelumnya, kebijakan berikut akan mengevaluasi `ALLOW` apakah tindakan tersebut `viewSalary` dan sumber daya dalam permintaan memiliki atribut `owner.manager` yang sama dengan`principal`, atau atribut `owner` yang sama dengan. `principal` 

```
permit (
    principal,
    action == PayrollApp::Action::"viewSalary",
    resource
)
when {
    principal == resource.owner.manager ||
    principal == resource.owner
};
```

Misalnya, jika Alice adalah pengguna yang masuk yang meminta laporan gaji, dan jika Alice adalah manajer pemilik atau pemilik laporan, maka kebijakan tersebut akan dievaluasi. `ALLOW`

Untuk informasi selengkapnya tentang menggunakan operator logis dengan kebijakan Cedar, lihat dokumentasi [Cedar](https://docs.cedarpolicy.com/policies/syntax-operators.html).