

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon 已验证权限策略模板和模板关联政策
<a name="policy-templates"></a>

在已验证权限中，策略模板是带有`principal``resource`、或两者占位符的策略。不能仅使用策略模板来处理授权请求。要处理授权请求，必须基于*策略模板创建与模板关联*的策略。策略模板允许只定义一次策略，然后与多个委托人和资源一起使用。对策略模板的更新会反映在使用该模板的所有策略中。有关更多信息，请参阅《Cedar 策略语言参考指南》中的 [Cedar 策略模板](https://docs.cedarpolicy.com/policies/templates.html)。

您可以选择为策略模板分配策略模板名称。策略模板名称在策略存储中必须是唯一的，并以`name/`此为前缀。在接受`policyTemplateId`参数的控制平面操作中，您可以使用策略模板名称代替策略模板 ID。只`GetPolicyTemplate`在输出中`ListPolicyTemplates`返回名称。以下示例使用策略模板名称来检索策略模板`GetPolicyTemplate`。

```
$ aws verifiedpermissions get-policy-template \
    --policy-template-id name/example-policy-template \
    --policy-store-id PSEXAMPLEabcdefg111111
```

例如，以下策略模板为使用该策略模板的委托人和资源提供`Read``Edit`、和`Comment`权限。

```
permit(
  principal == ?principal,
  action in [Action::"Read", Action::"Edit", Action::"Comment"],
  resource == ?resource
);
```

如果您要创建`Editor`基于此模板命名的策略，则当委托人被指定为特定资源的编辑者时，您的应用程序将创建一个策略，为委托人提供读取、编辑和评论该资源的权限。

与静态策略不同，模板关联策略是动态的。以前面的示例为例，如果您要从策略模板中删除`Comment`操作，则任何链接到该模板或基于该模板的策略都将相应更新，并且策略中指定的委托人将无法再对相应的资源发表评论。

有关更多与模板关联的策略示例，请参阅。[Amazon 已验证权限示例模板关联政策](policy-templates-example-policies.md)

# 创建 Amazon 已验证权限策略模板
<a name="policy-templates-create"></a>

您可以使用 AWS 管理控制台、或，在 “已验证权限” 中 AWS CLI创建策略模板 AWS SDKs。策略模板允许只定义一次策略，然后与多个委托人和资源一起使用。创建策略模板后，您可以创建与模板关联的策略，以使用包含特定委托人和资源的策略模板。有关更多信息，请参阅 [创建与 Amazon 验证权限模板关联的政策](policy-templates-create-policy.md)。

------
#### [ AWS 管理控制台 ]

**创建策略模板**

1. 打开已[验证权限控制台](https://console.aws.amazon.com/verifiedpermissions/)。选择您的保单存储。

1. 在左侧的导航窗格中，选择**策略模板**。

1. 选择**创建策略模板**。

1. 在**详细信息**部分，输入**策略模板描述**。

1. 在**策略模板正文**部分，使用占位符 `?principal` 和 `?resource` 以允许基于此模板创建的策略自定义其授予的权限。您可以选择**格式**，使用建议的间距和缩进来设置策略模板语法的格式。

1. 选择**创建策略模板**。

------
#### [ AWS CLI ]

**要创建策略模板，请按以下步骤操作：**  
您可以使用[CreatePolicyTemplate](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_CreatePolicyTemplate.html)操作创建策略模板。以下示例创建了一个带主体占位符的策略模板。

`template1.txt` 文件包含以下内容。

```
"VacationAccess"
permit(
    principal in ?principal,
    action == Action::"view",
    resource == Photo::"VacationPhoto94.jpg"
);
```

```
$ aws verifiedpermissions create-policy-template \
    --description "Template for vacation picture access" 
    --statement file://template1.txt 
    --policy-store-id PSEXAMPLEabcdefg111111
{
    "createdDate": "2023-05-18T21:17:47.284268+00:00",
    "lastUpdatedDate": "2023-05-18T21:17:47.284268+00:00",
    "policyStoreId": "PSEXAMPLEabcdefg111111",
    "policyTemplateId": "PTEXAMPLEabcdefg111111"
}
```

**使用策略模板名称创建策略模板**  
在创建策略模板时，您可以选择指定策略模板名称。对于策略存储区内的所有策略模板，该名称必须是唯一的，并以`name/`此为前缀。您可以使用名称来代替策略模板 ID。

```
$ aws verifiedpermissions create-policy-template \
    --description "Template for vacation picture access" \
    --statement file://template1.txt \
    --policy-store-id PSEXAMPLEabcdefg111111 \
    --name name/example-policy-template
{
    "createdDate": "2023-06-12T20:47:42.804511+00:00",
    "lastUpdatedDate": "2023-06-12T20:47:42.804511+00:00",
    "policyStoreId": "PSEXAMPLEabcdefg111111",
    "policyTemplateId": "PTEXAMPLEabcdefg111111"
}
```

**注意**  
如果您指定的名称已与策略存储中的其他策略模板相关联，则会收到`ConflictException`错误消息。

------

# 创建与 Amazon 验证权限模板关联的政策
<a name="policy-templates-create-policy"></a>

您可以使用、或创建与模板关联的策略或基于策略模板的 AWS 管理控制台策略。 AWS CLI AWS SDKs模板链接策略与其策略模板保持关联。如果您更改策略模板中的策略声明，则任何链接到该模板的策略将自动使用新声明来做出从那一刻起做出的所有授权决定。

有关与模板关联的策略示例，请参阅。[Amazon 已验证权限示例模板关联政策](policy-templates-example-policies.md)

------
#### [ AWS 管理控制台 ]

**要通过实例化策略模板来创建模板链接策略，请按以下步骤操作：**

1. 打开已[验证权限控制台](https://console.aws.amazon.com/verifiedpermissions/)。选择您的保单商店。

1. 在左侧的导航窗格中，选择**策略**。

1. 选择**创建策略**，然后选择**创建模板链接策略**。

1. 选中要使用的策略模板旁边的单选按钮，然后选择**下一步**。

1. 输入要用于此模板链接策略特定实例的**主体**和**资源**。指定的值显示在**预览策略语句**字段中。
**注意**  
**主体**和**资源**值的格式必须与静态策略相同。例如，要为主体指定 `AdminUsers` 组，请输入 `Group::"AdminUsers"`。如果您输入 `AdminUsers`，会显示验证错误。

1. 选择**创建模板链接策略**。

   新的模板链接策略显示在**策略**下。

------
#### [ AWS CLI ]

**要通过实例化策略模板来创建模板链接策略，请按以下步骤操作：**  
您可以创建一个模板链接策略，该策略引用现有策略模板，并为该模板使用的任何占位符指定值。

下方示例创建了一个模板链接策略，该策略使用包含以下语句的模板：

```
permit(
    principal in ?principal,
    action == PhotoFlash::Action::"view",
    resource == PhotoFlash::Photo::"VacationPhoto94.jpg"
);
```

它还使用下方的 `definition.txt` 文件来提供 `definition` 参数的值：

```
{
    "templateLinked": {
        "policyTemplateId": "PTEXAMPLEabcdefg111111",
        "principal": {
            "entityType": "PhotoFlash::User",
            "entityId": "alice"
        }
    }
}
```

输出显示的是从模板中获得的资源和从定义参数中获得的主体

```
$ aws verifiedpermissions create-policy \
    --definition file://definition.txt
    --policy-store-id PSEXAMPLEabcdefg111111
{
    "createdDate": "2023-05-22T18:57:53.298278+00:00",
    "lastUpdatedDate": "2023-05-22T18:57:53.298278+00:00",
    "policyId": "TPEXAMPLEabcdefg111111",
    "policyStoreId": "PSEXAMPLEabcdefg111111",
    "policyType": "TEMPLATELINKED",
    "principal": {
        "entityId": "alice",
        "entityType": "PhotoFlash::User"
    },
    "resource": {
        "entityId": "VacationPhoto94.jpg",
        "entityType": "PhotoFlash::Photo"
    }
}
```

------

# 编辑 Amazon 已验证权限策略模板
<a name="policy-templates-edit"></a>

您可以使用、或，在 “已验证权限” 中 AWS 管理控制台编辑或更新策略模板 AWS SDKs。 AWS CLI编辑策略模板将自动更新与该模板关联或基于该模板的策略，因此在编辑策略模板时要小心，并确保不会意外引入会破坏应用程序的更改。

您可以更改策略模板的以下元素：
+ 策略模板所`action`引用的
+ 条件子句，例如`when`和 `unless`

您无法更改策略模板的以下元素。要更改这些元素中的任何一个，都需要删除并重新创建策略模板。
+ 来自`permit`或的策略模板的效果 `forbid`
+ 策略模板所`principal`引用的
+ 策略模板所`resource`引用的

------
#### [ AWS 管理控制台 ]

**要编辑您的策略模板，请按以下步骤操作：**

1. 打开已[验证权限控制台](https://console.aws.amazon.com/verifiedpermissions/)。选择您的保单存储。

1. 在左侧的导航窗格中，选择**策略模板**。控制台会显示您在当前策略存储中创建的所有策略模板。

1. 选择策略模板旁边的单选按钮，以显示有关该策略模板的详细信息，例如策略模板的创建和更新时间，以及策略模板的内容。

1. 选择**编辑**，以编辑您的策略模板。根据需要更新**策略描述**和**策略正文**，然后选择**更新策略模板**。

1. 您可以通过选择策略模板旁边的单选按钮，然后选择**删除**来删除策略模板。选择**确定**，确认删除策略模板。

------
#### [ AWS CLI ]

**编辑策略模板**  
您可以使用[UpdatePolicy](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_UpdatePolicy.html)操作创建静态策略。以下示例利用文件中定义的新策略替换指定策略模板的策略主体来更新该模板。

`template1.txt` 文件的内容：

```
permit(
    principal in ?principal,
    action == Action::"view",
    resource in ?resource)
when {
    principal has department && principal.department == "research"
};
```

```
$ aws verifiedpermissions update-policy-template \
    --policy-template-id PTEXAMPLEabcdefg111111 \
    --description "My updated template description" \
    --statement file://template1.txt \ 
    --policy-store-id PSEXAMPLEabcdefg111111
{
    "createdDate": "2023-05-17T18:58:48.795411+00:00",
    "lastUpdatedDate": "2023-05-17T19:18:48.870209+00:00",
    "policyStoreId": "PSEXAMPLEabcdefg111111",
    "policyTemplateId": "PTEXAMPLEabcdefg111111"
}
```

**更新策略模板的名称**  
更新策略模板时，您可以设置或更新策略模板名称。对于策略存储区内的所有策略模板，该名称必须是唯一的，并以`name/`此为前缀。如果您未在更新请求中包含姓名字段，则现有名称将保持不变。要删除名称，请将其设置为空字符串。

```
$ aws verifiedpermissions update-policy-template \
    --policy-template-id PTEXAMPLEabcdefg111111 \
    --statement file://template1.txt \
    --policy-store-id PSEXAMPLEabcdefg111111 \
    --name name/example-policy-template
{
    "createdDate": "2023-05-17T18:58:48.795411+00:00",
    "lastUpdatedDate": "2023-05-17T19:18:48.870209+00:00",
    "policyStoreId": "PSEXAMPLEabcdefg111111",
    "policyTemplateId": "PTEXAMPLEabcdefg111111"
}
```

------

# Amazon 已验证权限示例模板关联政策
<a name="policy-templates-example-policies"></a>

使用**示例策略存储**方法在 Verified Permissions 中创建策略存储时，您的策略存储是使用预定义的策略、策略模板和所选示例项目的架构创建的。以下 Verified Permissions 模板链接策略示例可用于示例策略存储及其各自的策略、策略模板和架构。

## PhotoFlash 例子
<a name="policy-templates-example-policies-photoflash"></a>

以下示例说明如何创建模板关联策略，该策略使用策略模板**授予对与个人用户共享的非私密照片和照片的有限访问权限**。

**注意**  
Cedar 策略语言将实体视为 `in` 自身。因此，`principal in User::"Alice"` 等同于 `principal == User::"Alice"`。

```
permit (
 principal in PhotoFlash::User::"Alice",
 action in PhotoFlash::Action::"SharePhotoLimitedAccess",
 resource in PhotoFlash::Photo::"VacationPhoto94.jpg"
 );
```

以下示例说明如何创建模板关联策略，该策略使用策略模板**授予对与个人用户和相册共享的非私密照片的有限访问权限**。

```
permit (
 principal in PhotoFlash::User::"Alice",
 action in PhotoFlash::Action::"SharePhotoLimitedAccess",
 resource in PhotoFlash::Album::"Italy2023"
 );
```

以下示例说明如何创建模板关联策略，该策略使用策略模板**授予对与朋友群组和个人照片的非私密共享照片的有限访问权限**。

```
permit (
 principal in PhotoFlash::FriendGroup::"Jane::MySchoolFriends",
 action in PhotoFlash::Action::"SharePhotoLimitedAccess",
 resource in PhotoFlash::Photo::"VacationPhoto94.jpg"
 );
```

以下示例说明如何创建模板关联策略，该策略使用策略模板**授予对与好友群组和相册共享的非私密照片的有限访问权限**。

```
permit (
 principal in PhotoFlash::FriendGroup::"Jane::MySchoolFriends",
 action in PhotoFlash::Action::"SharePhotoLimitedAccess",
 resource in PhotoFlash::Album::"Italy2023"
 );
```

以下示例显示了如何使用策略模板创建与模板关联的策略，该策略模板**授予对与好友群组共享的非私密照片和个人照片的完全访问权限**。

```
permit (
 principal in PhotoFlash::UserGroup::"Jane::MySchoolFriends",
 action in PhotoFlash::Action::"SharePhotoFullAccess",
 resource in PhotoFlash::Photo::"VacationPhoto94.jpg"
 );
```

以下示例显示了如何使用策略模板 “**阻止用户访问**账户” 来创建与模板关联的策略。

```
forbid(
 principal == PhotoFlash::User::"Bob",
 action,
 resource in PhotoFlash::Account::"Alice-account"
 );
```

## DigitalPetStore 例子
<a name="policy-templates-example-policies-digitalpetstore"></a>

 DigitalPetStore 示例策略存储库不包含任何策略模板。创建**DigitalPetStore**示例策略存储后，您可以通过在左侧导航窗格中选择**策略**来查看策略存储中包含的策略。

## TinyToDo 例子
<a name="policy-templates-example-policies-tinytodo"></a>

以下示例说明如何创建与模板关联的策略，该策略使用策略模板，为单个用户和任务列表提供查看者访问权限。

```
permit (
    principal == TinyTodo::User::"https://cognito-idp.us-east-1.amazonaws.com/us-east-1_h2aKCU1ts|5ae0c4b1-6de8-4dff-b52e-158188686f31|bob",
    action in [TinyTodo::Action::"ReadList", TinyTodo::Action::"ListTasks"],
    resource == TinyTodo::List::"1"
);
```

以下示例显示了如何创建与模板关联的策略，该策略使用策略模板为单个用户和任务列表提供编辑访问权限。

```
permit (
    principal == TinyTodo::User::"https://cognito-idp.us-east-1.amazonaws.com/us-east-1_h2aKCU1ts|5ae0c4b1-6de8-4dff-b52e-158188686f31|bob",
    action in [
        TinyTodo::Action::"ReadList",
        TinyTodo::Action::"UpdateList",
        TinyTodo::Action::"ListTasks",
        TinyTodo::Action::"CreateTask",
        TinyTodo::Action::"UpdateTask",
        TinyTodo::Action::"DeleteTask"
    ],
    resource == TinyTodo::List::"1"
);
```