

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 範例 1：具有已驗證許可和 Cedar 的基本 ABAC
<a name="avp-basic-abac-examples"></a>

在此範例案例中，Amazon Verified Permissions 用於判斷哪些使用者可存取虛構薪資微服務中的資訊。本節包含 Cedar 程式碼片段，示範如何使用 Cedar 來呈現存取控制決策。這些範例並非旨在完整探索 Cedar 和 Verified Permissions 所提供的功能。如需 Cedar 的更完整概觀，請參閱 [Cedar 文件](https://docs.cedarpolicy.com/)。

在下圖中，我們希望強制執行與 `viewSalary``GET`方法相關聯的兩個一般業務規則：*員工可以檢視自己的薪資*，而*員工可以檢視向其報告的任何人員的薪資。*您可以使用 Verified Permissions 政策來強制執行這些業務規則。

![使用 Amazon Verified Permissions 和 Cedar 實作 PDP 的基本 ABAC 實作範例](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/saas-multitenant-api-access-authorization/images/avp-example-1.png)


*員工可以檢視自己的薪資。*

在 Cedar 中，基本建構是*實體*，代表委託人、動作或資源。若要提出授權請求並使用 Verified Permissions 政策開始評估，您需要提供*委託人、**動作**、資源*和*實體清單。*
+ 主體 (`principal`) 是登入的使用者或角色。
+ 動作 (`action`) 是由請求評估的操作。
+ 資源 (`resource`) 是動作正在存取的元件。
+ 實體清單 (`entityList`) 包含評估請求所需的所有必要實體。

為了滿足業務規則 *員工可以檢視自己的薪資*，您可以提供驗證許可政策，如下所示。

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

此政策會評估 `Action` `ALLOW`是否為 ，`viewSalary`且請求中的資源是否具有等於主體的屬性擁有者。例如，如果 Bob 是請求薪資報告的登入使用者，也是薪資報告的擁有者，則政策會評估為 `ALLOW`。

下列授權請求會提交至驗證許可，以供範例政策評估。在此範例中，Bob 是發出`viewSalary`請求的登入使用者。因此，Bob 是實體類型 的委託人`Employee`。Bob 嘗試執行的動作是 ，而 `viewSalary` 顯示`viewSalary,`的資源`Salary-Bob`是 類型`Salary`。為了評估 Bob 是否可以檢視`Salary-Bob`資源，您需要提供將 類型`Employee`與 值 `Bob`（委託人） 連結至類型為 之資源擁有者屬性`Salary`的實體結構。您可以在 中提供此結構`entityList`，其中與 相關聯的屬性`Salary`包含擁有者，指定包含類型`Employee`和值 `entityIdentifier`的 `Bob`。Verified Permissions 會將授權請求中`principal`提供的 與與`Salary`資源相關聯的 `owner` 屬性進行比較，以做出決策。

```
{
  "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": {}
      }
    ]
  }
}
```

Verified Permissions 的授權請求會傳回下列項目做為輸出，其中 屬性`decision`為 `ALLOW`或 `DENY`。

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

在此情況下，由於 Bob 嘗試檢視自己的薪資，傳送至 Verified Permissions 的授權請求會評估為 `ALLOW`。不過，我們的目標是使用 Verified Permissions 來強制執行兩個業務規則。陳述下列項目的商業規則也應該是 true：

*員工可以檢視向他們報告的任何人員的薪資。*

若要滿足此業務規則，您可以提供另一個政策。下列政策會評估 動作`ALLOW`是否為 ，`viewSalary`且請求中的資源是否具有`owner.manager`等於委託人的屬性。例如，如果 Alice 是請求薪資報告的登入使用者，而 Alice 是報告擁有者的經理，則政策會評估為 `ALLOW`。

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

下列授權請求會提交至驗證許可，以供範例政策評估。在此範例中，Alice 是發出`viewSalary`請求的登入使用者。因此，Alice 是委託人，而實體的類型為 `Employee`。Alice 嘗試執行的動作是 `viewSalary`，而`viewSalary`顯示的資源類型為 `Salary`，值為 `Salary-Bob`。為了評估 Alice 是否可以檢視`Salary-Bob`資源，您需要提供將 類型`Employee`與 `manager` 值連結至 屬性`Alice`的實體結構，該結構接著必須與 類型 `owner` 值`Salary`為 的 屬性相關聯`Salary-Bob`。您可以在 中提供此結構`entityList`，其中與 相關聯的屬性`Salary`包含擁有者，指定包含類型`Employee`和值 `entityIdentifier`的 `Bob`。Verified Permissions 會先檢查 `owner` 屬性，該屬性會評估為 類型`Employee`和值 `Bob`。然後，Verified Permissions 會評估與 相關聯的`manager`屬性，`Employee`並將其與提供的委託人進行比較，以做出授權決策。在這種情況下，決策`ALLOW`是因為 `principal `和 `resource.owner.manager` 屬性相等。

```
{
  "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": []
      }
    ]
  }
}
```

到目前為止，在此範例中，我們提供了與 `viewSalary`方法相關聯的兩個業務規則，*員工可以檢視自己的薪資*，而*員工可以檢視向其報告之任何人的薪資*，並將 Verified Permissions 視為政策，以獨立滿足每個業務規則的條件。您也可以使用單一已驗證許可政策來滿足這兩個業務規則的條件：

*員工可以檢視自己的薪資以及向其報告的任何人的薪資。*

當您使用先前的授權請求時，下列政策會評估 動作`ALLOW`是否為 ，`viewSalary`而請求中的資源是否具有等於 `owner.manager`的 屬性`principal`，或 屬性`owner`是否等於 `principal`。

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

例如，如果 Alice 是請求薪資報告的登入使用者，而且 Alice 是擁有者的經理或報告的擁有者，則政策會評估為 `ALLOW`。

如需搭配 Cedar 政策使用邏輯運算子的詳細資訊，請參閱 [Cedar 文件](https://docs.cedarpolicy.com/policies/syntax-operators.html)。