

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

# Amazon Verified Permissions 策略
<a name="policies"></a>

*策略*是一种允许或禁止*主体*对*资源*采取一项或多项*操作*的语句。每项策略的评估都独立于其他所有策略。有关 Cedar 策略的结构和评估方式的更多信息，请参阅《Cedar 策略语言参考指南》中的[根据架构验证 Cedar 策略](https://docs.cedarpolicy.com/policies/validation.html)。

您可以选择为策略分配策略名称。策略存储区内所有策略的策略名称必须是唯一的，并以`name/`此为前缀。在接受`policyId`参数的控制平面操作中，您可以使用策略名称代替策略 ID。以下示例使用策略名称来检索策略`GetPolicy`。

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

**重要**  
在编写引用主体、资源和操作的 Cedar 策略时，您可以定义用于每个元素的唯一标识符。我们强烈建议您遵循以下最佳实践：  
**对所有主体和资源标识符使用通用唯一标识符 (UUIDs)。**  
例如，如果用户 `jane` 离开公司，而您后来让其他人使用 `jane` 这个名称，那么，该新用户将自动获得仍引用 `User::"jane"` 的策略所授予的所有内容的访问权限。Cedar 无法区分新用户和旧用户。这同时适用于主体标识符和资源标识符。请务必使用保证唯一且永远不可重复使用的标识符，确保您不会因为策略中存在旧标识符而在无意中授予他人访问权限。  
在为实体使用 UUID 时，我们建议您在它后面加上 // 注释说明符和实体的“友好”名称。这有助于使您的策略更易于理解。例如：校长 == 角色:: “a1b2c3d4-e5f6-a1b2-c3d4-”，//管理员 EXAMPLE11111
**请勿在主体或资源的唯一标识符中包含个人识别信息、机密信息或敏感信息。**这些标识符包含在 AWS CloudTrail 跟踪中共享的日志条目中。

**Topics**
+ [创建 Amazon Verified Permissions 静态策略](policies-create.md)
+ [编辑 Amazon Verified Permissions 静态策略](policies-edit.md)
+ [添加上下文](context.md)
+ [使用 Amazon 已验证权限测试平台](test-bench.md)
+ [Amazon Verified Permissions 示例策略](policies-examples.md)

# 创建 Amazon Verified Permissions 静态策略
<a name="policies-create"></a>

您可以为委托人创建静态策略，以允许或禁止他们对应用程序的指定资源执行指定操作。静态策略包含`principal``resource`和的特定值，可以随时用于授权决策。

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

**要创建静态策略，请按以下步骤操作：**

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

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

1. 选择**创建策略**，然后选择**创建静态策略**。
**注意**  
如果您想使用政策声明，请跳至**步骤 8**，然后将该政策粘贴到下一页的 “**政策**” 部分。

1. 在**策略效果**部分，选择当请求与策略匹配时，策略是**允许**还是**禁止**。如果您选择 Per **m** it，则该策略允许委托人对资源执行操作。相反，如果您选择 “**禁止**”，则该策略不允许委托人对资源执行操作。

1. 在**主体范围**字段中，选择策略将适用的主体范围。
   + 选择**特定主体**，将策略应用于特定主体。为被允许或禁止采取策略中指定的操作的委托人指定实体类型和标识符。
   + 选择**主体群组**，将策略应用于一组主体。在**主体群组**字段中输入主体群组名称。
   + 选择**所有主体**，将该策略应用于策略存储中的所有主体。

1. 在**资源范围**字段中，选择策略将适用的资源范围。
   + 选择**特定资源**，将该策略应用于特定资源。为策略应适用的资源指定实体类型和标识符。
   + 选择**资源群组**，将该策略应用于一组资源。在**资源群组**字段中输入资源群组名称。
   + 选择**所有资源**，将该策略应用于策略存储中的所有资源。

1. 在**操作范围**部分中，选择策略将适用的资源范围。
   + 选择**特定操作集合**，将该策略应用于一组操作。选中操作旁边的复选框，应用该策略。
   + 选择**所有操作**，将该策略应用于策略存储中的所有操作。

1. 选择**下一步**。

1. 在**策略**部分中，查看您的 Cedar 策略。您可以选择**格式**，使用建议的间距和缩进来设置策略语法的格式。有关更多信息，请参阅《Cedar 策略语言参考指南》中的 [Cedar 中的基本策略构造](https://docs.cedarpolicy.com/policies/syntax-policy.html)。

1. 在**详细信息**部分中，输入策略的可选描述。

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

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

**要创建静态策略，请按以下步骤操作：**  
您可以使用[CreatePolicy](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_CreatePolicy.html)操作创建静态策略。以下示例创建了一个简单的静态策略。

```
$ aws verifiedpermissions create-policy \
    --definition "{ \"static\": { \"Description\": \"MyTestPolicy\", \"Statement\": \"permit(principal,action,resource) when {principal.owner == resource.owner};\"}}" \
    --policy-store-id PSEXAMPLEabcdefg111111
{
"Arn": "arn:aws:verifiedpermissions::123456789012:policy/PSEXAMPLEabcdefg111111/SPEXAMPLEabcdefg111111",
    "createdDate": "2023-05-16T20:33:01.730817+00:00",
    "lastUpdatedDate": "2023-05-16T20:33:01.730817+00:00",
    "policyId": "SPEXAMPLEabcdefg111111",
    "policyStoreId": "PSEXAMPLEabcdefg111111",
    "policyType": "STATIC"
}
```

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

```
$ aws verifiedpermissions create-policy \
    --definition "{ \"static\": { \"Statement\": \"permit(principal, action, resource in Album::\\\"public_folder\\\");\"}}" \
    --policy-store-id PSEXAMPLEabcdefg111111 \
    --name name/example-policy
{
    "createdDate": "2023-06-12T20:33:37.382907+00:00",
    "lastUpdatedDate": "2023-06-12T20:33:37.382907+00:00",
    "policyId": "SPEXAMPLEabcdefg111111",
    "policyStoreId": "PSEXAMPLEabcdefg111111",
    "policyType": "STATIC",
    "resource": {
        "entityId": "public_folder",
        "entityType": "Album"
    }
}
```

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

------

# 编辑 Amazon Verified Permissions 静态策略
<a name="policies-edit"></a>

您可以编辑策略存储库中的现有静态策略。您只能直接更新静态策略。要更改与模板关联的策略，必须更新策略模板。有关更多信息，请参阅 [编辑 Amazon 已验证权限策略模板](policy-templates-edit.md)。

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

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

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

**要编辑静态策略，请按以下步骤操作：**

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

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

1. 选中要编辑的静态策略旁边的单选按钮，然后选择**编辑**。

1. 在**策略正文**部分中，更新静态策略的 `action` 或条件子句。您无法更新策略效果，以及策略的 `principal` 或 `resource`。

1. 选择**更新策略**。
**注意**  
如果在策略存储中启用了[策略验证](policy-validation-mode.md)，则更新静态策略会导致 Verified Permissions 针对策略存储中的架构验证策略。如果更新后的静态策略未通过验证，则操作将失败，并且不会保存更新。

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

**要编辑静态策略，请按以下步骤操作：**  
您可以使用[UpdatePolicy](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_UpdatePolicy.html)操作编辑静态策略。以下示例编辑了一个简单的静态策略。

该示例使用 `definition.txt` 文件来包含策略定义。

```
{
    "static": {
        "description":  "Grant everyone of janeFriends UserGroup access to the vacationFolder Album",
        "statement": "permit(principal in UserGroup::\"janeFriends\", action, resource in Album::\"vacationFolder\" );"
    }
}
```

以下命令引用了该文件。

```
$ aws verifiedpermissions create-policy \
    --definition file://definition.txt \
    --policy-store-id PSEXAMPLEabcdefg111111

{
    "createdDate": "2023-06-12T20:33:37.382907+00:00",
    "lastUpdatedDate": "2023-06-12T20:33:37.382907+00:00",
    "policyId": "SPEXAMPLEabcdefg111111",
    "policyStoreId": "PSEXAMPLEabcdefg111111",
    "policyType": "STATIC",
    "principal": {
        "entityId": "janeFriends",
        "entityType": "UserGroup"
    },
    "resource": {
        "entityId": "vacationFolder",
        "entityType": "Album"
    }
}
```

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

```
$ aws verifiedpermissions update-policy \
    --policy-id SPEXAMPLEabcdefg111111 \
    --policy-store-id PSEXAMPLEabcdefg111111 \
    --definition file://definition.txt \
    --name name/example-policy
{
    "createdDate": "2023-06-12T20:33:37.382907+00:00",
    "lastUpdatedDate": "2023-06-12T20:47:42.804511+00:00",
    "policyId": "SPEXAMPLEabcdefg111111",
    "policyStoreId": "PSEXAMPLEabcdefg111111",
    "policyType": "STATIC",
    "principal": {
        "entityId": "janeFriends",
        "entityType": "UserGroup"
    },
    "resource": {
        "entityId": "vacationFolder",
        "entityType": "Album"
    }
}
```

------

# 添加上下文
<a name="context"></a>

*情境*是指与政策决策相关的信息，但不是您的委托人、行为或资源身份的一部分。访问令牌声明是上下文。您可能只想允许来自一组源 IP 地址的操作，或者仅当您的用户已使用 MFA 登录时才允许执行操作。您的应用程序可以访问此上下文会话数据，并且必须将其填充到授权请求中。已验证权限授权请求中的上下文数据在元素中必须采用 JSON 格式。`contextMap`

说明此内容的示例来自[策略存储库示](policy-stores-create.md)例。要继续操作，请在您的测试环境中创建**DigitalPetStore**示例策略存储。

以下上下文对象根据示例**DigitalPetStore**策略存储为应用程序声明每种 Cedar 数据类型之一。

```
"context": {
  "contextMap": {
    "AccountCodes": {
      "set": [
        {
          "long": 111122223333
        },
        {
          "long": 444455556666
        },
        {
          "long": 123456789012
        }
      ]
    },
    "approvedBy": {
    "entityIdentifier": {
      "entityId": "Bob",
      "entityType": "DigitalPetStore::User"
    }
    },
    "MfaAuthorized": {
      "boolean": true
    },
    "NetworkInfo": {
      "record": {
        "IPAddress": {
          "string": "192.0.2.178"
        },
        "Country": {
          "string": "United States of America"
        },
        "SSL": {
          "boolean": true
        }
    }
    },
    "RequestedOrderCount": {
      "long": 4
    },
    "UserAgent": {
      "string": "My UserAgent 1.12"
    }
  }
}
```授权上下文中的数据类型

**布尔值**  
二进制`true`或`false`值。在示例中，布尔值 f `true` or `MfaAuthenticated` 表示客户在请求查看订单之前已执行多因素身份验证。

**设置**  
上下文元素的集合。集合成员可以是完全相同的类型（如本例所示），也可以是不同的类型，包括嵌套的集合。在示例中，客户与 3 个不同的账户相关联。

**字符串**  
由字母、数字或符号组成的序列，用`"`字符括起来。在示例中，`UserAgent`字符串表示客户用来请求查看其订单的浏览器。

**长整型**  
一个整数。在示例中，`RequestedOrderCount`表示此请求是由于客户要求查看其过去的四个订单而产生的批次的一部分。

**记录**  
属性的集合。您必须在请求上下文中声明这些属性。带有架构的策略存储区必须在架构中包含该实体和该实体的属性。在示例中，`NetworkInfo`记录包含有关用户的原始 IP、由客户端确定的该 IP 的地理位置以及传输中的加密的信息。

**EntityIdentifier**  
对请求`entities`元素中声明的实体和属性的引用。在示例中，用户的订单已由员工批准`Bob`。

要**在示例**DigitalPetStore**应用程序中测试此示例上下文，您必须更新您的请求`entities`、策略存储架构和静态策略，描述为 Customer Role-Get Order**。

## 正在修改 DigitalPetStore 以接受授权上下文
<a name="authorization-context-example"></a>

最初，**DigitalPetStore**不是一个非常复杂的策略存储。它不包含任何预配置的策略或上下文属性来支持我们所呈现的上下文。要使用此上下文信息评估授权请求示例，请对您的策略存储和授权请求进行以下修改。有关以访问令牌信息为上下文的上下文示例，请参阅[映射 Amazon Cognito 访问令牌](cognito-map-token-to-schema.md#cognito-map-access-token)和[映射 OIDC 访问](oidc-map-token-to-schema.md#oidc-map-access-token)令牌。

------
#### [ Schema ]

对您的策略存储架构应用以下更新以支持新的上下文属性。更新`GetOrder``actions`如下。

```
"GetOrder": {
  "memberOf": [],
  "appliesTo": {
    "resourceTypes": [
      "Order"
    ],
    "context": {
      "type": "Record",
      "attributes": {
        "AccountCodes": {
          "type": "Set",
          "required": true,
          "element": {
            "type": "Long"
          }
        },
        "approvedBy": {
          "name": "User",
          "required": true,
          "type": "Entity"
        },
        "MfaAuthorized": {
          "type": "Boolean",
          "required": true
        },
        "NetworkInfo": {
          "type": "NetworkInfo",
          "required": true
        },
        "RequestedOrderCount": {
          "type": "Long",
          "required": true
        },
        "UserAgent": {
          "required": true,
          "type": "String"
        }
      }
    },
    "principalTypes": [
      "User"
    ]
  }
}
```

要引用在请求上下文`NetworkInfo`中命名的`record`数据类型，请在架构中创建一个 [CommonTyp](https://docs.cedarpolicy.com/schema/schema.html#schema-commonTypes) e 结构，方法是在`actions`架构中添加以下内容。`commonType`构造是一组共享的属性，您可以将其应用于不同的实体。

```
"commonTypes": {
  "NetworkInfo": {
    "attributes": {
      "IPAddress": {
        "type": "String",
        "required": true
      },
      "SSL": {
        "required": true,
        "type": "Boolean"
      },
      "Country": {
        "required": true,
        "type": "String"
      }
    },
    "type": "Record"
  }
},
```

------
#### [ Policy ]

以下策略设置了每个提供的上下文元素必须满足的条件。它建立在现有静态政策的基础上，描述为 “**客户角色-获取订单**”。该策略最初只要求发出请求的委托人是资源的所有者。

```
permit (
    principal in DigitalPetStore::Role::"Customer",
    action in [DigitalPetStore::Action::"GetOrder"],
    resource
) when {
    principal == resource.owner &&
    context.AccountCodes.contains(111122223333) &&
    context.approvedBy in DigitalPetStore::Role::"Employee" &&
    context.MfaAuthorized == true &&
    context.NetworkInfo.Country like "*United States*" &&
    context.NetworkInfo.IPAddress like "192.0.2.*" &&
    context.NetworkInfo.SSL == true &&
    context.RequestedOrderCount <= 4 &&
    context.UserAgent like "*My UserAgent*"
};
```

现在，我们要求检索订单的请求必须满足我们在请求中添加的其他上下文条件。

1. 用户必须使用 MFA 登录。

1. 用户的 Web 浏览器`User-Agent`必须包含字符串`My UserAgent`。

1. 用户必须请求查看 4 个或更少的订单。

1. 用户的账户代码之一必须是`111122223333`。

1. 用户的 IP 地址必须来自美国，他们必须处于加密会话中，并且他们的 IP 地址必须以`192.0.2.`开头。

1. 员工必须已批准他们的订单。在授权请求的`entities`元素中，我们将声明一个角色为的`Bob`用户`Employee`。

------
#### [ Request body ]

在使用适当的架构和策略配置策略存储后，您可以向 “已验证权限 API” 操作提交此授权请求[IsAuthorized](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_IsAuthorized.html)。请注意，该`entities`区段包含一个角色为的用户的定义`Employee`。`Bob`

```
{
  "principal": {
    "entityType": "DigitalPetStore::User",
    "entityId": "Alice"
  },
  "action": {
    "actionType": "DigitalPetStore::Action",
    "actionId": "GetOrder"
  },
  "resource": {
    "entityType": "DigitalPetStore::Order",
    "entityId": "1234"
  },
  "context": {
    "contextMap": {
      "AccountCodes": {
        "set": [
          {"long": 111122223333},
          {"long": 444455556666},
          {"long": 123456789012}
        ]
      },
      "approvedBy": {
        "entityIdentifier": {
          "entityId": "Bob",
          "entityType": "DigitalPetStore::User"
        }
      },
      "MfaAuthorized": {
        "boolean": true
      },
      "NetworkInfo": {
        "record": {
          "Country": {"string": "United States of America"},
          "IPAddress": {"string": "192.0.2.178"},
          "SSL": {"boolean": true}
        }
      },
      "RequestedOrderCount":{
        "long": 4
      },
      "UserAgent": {
        "string": "My UserAgent 1.12"
      }
    }
  },
  "entities": {
    "entityList": [
      {
        "identifier": {
          "entityType": "DigitalPetStore::User",
          "entityId": "Alice"
        },
        "attributes": {
          "memberId": {
            "string": "801b87f2-1a5c-40b3-b580-eacad506d4e6"
          }
        },
        "parents": [
          {
            "entityType": "DigitalPetStore::Role",
            "entityId": "Customer"
          }
        ]
      },
      {
        "identifier": {
          "entityType": "DigitalPetStore::User",
          "entityId": "Bob"
        },
        "attributes": {
          "memberId": {
            "string": "49d9b81e-735d-429c-989d-93bec0bcfd8b"
          }
        },
        "parents": [
          {
            "entityType": "DigitalPetStore::Role",
            "entityId": "Employee"
          }
        ]
      },
      {
        "identifier": {
          "entityType": "DigitalPetStore::Order",
          "entityId": "1234"
        },
        "attributes": {
          "owner": {
            "entityIdentifier": {
              "entityType": "DigitalPetStore::User",
              "entityId": "Alice"
            }
          }
        },
        "parents": []
      }
     ]
   },
   "policyStoreId": "PSEXAMPLEabcdefg111111"
}
```

------

# 使用 Amazon 已验证权限测试平台
<a name="test-bench"></a>

使用已验证权限测试平台，通过对已验证的权限策略运行[授权请求](terminology.md#term-authorization-request)，对这些策略进行测试和故障排除。该测试平台使用您指定的参数来确定您的策略存储中的 Cedar 策略是否会授权该请求。测试授权请求时，您可以在**可视模式**和 **JSON 模式**之间进行切换。有关 Cedar 策略的结构和评估方式的更多信息，请参阅《Cedar 策略语言参考指南》中的 [Cedar 中的基本策略构造](https://docs.cedarpolicy.com/policies/syntax-policy.html)。

**注意**  
使用 Verified Permissions 发出授权请求时，您可以在**其他实体**部分，在请求中提供主体和资源列表。不过，您无法包含有关操作的详细信息。这些信息必须在架构中指定，或者从请求中推断得出。您无法将操作置于**其他实体**部分。

有关测试平台的直观概述和演示，请参阅 AWS YouTube 频道上的 [Amazon 已验证权限——策略创建和测试（Primer 系列 \$13）](https://www.youtube.com/watch?v=Gi3joEySMPQ)。

------
#### [ Visual mode ]

**注意**  
要使用测试平台的**可视模式**，您必须在策略存储中定义一个架构。

**要在可视模式下测试策略，请按以下步骤操作：**

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

1. 在左侧导航窗格中，选择**测试平台**。

1. 选择**可视模式**。

1. 在**主体**部分，从架构的主体类型中选择**执行操作的主体**。在文本框中为该主体输入一个标识符。

1. （可选）选择**添加父级**，为指定主体添加父实体。要移除已添加到该主体的父实体，请选择父实体名称旁边的**删除**。

1. 为指定主体的每个属性指定**属性值**。该测试平台使用模拟授权请求中指定的属性值。

1. 在**资源**部分中，选择**主体正在执行的资源**。在文本框中为该资源输入一个标识符。

1. （可选）选择**添加父级**，为指定资源添加父实体。要删除已添加到该资源的父实体，请选择该父实体名称旁边的**删除**。

1. 为指定资源的每个属性指定**属性值**。该测试平台使用模拟授权请求中指定的属性值。

1. 在**操作**部分中，从指定主体和资源的有效操作列表中选择**主体正在执行的操作**。

1. 为指定操作的每个属性指定**属性值**。该测试平台使用模拟授权请求中指定的属性值。

1. （可选）在**其他实体**部分中，选择**添加实体**，以添加要在授权决策中评估的实体。

1. 从下拉列表中选择**实体标识符**并输入该实体标识符。

1. （可选）选择**添加父级**，为指定实体添加父实体。要删除已添加到该实体的父实体，请选择该父实体名称旁边的**删除**。

1. 为指定实体的每个属性指定**属性值**。该测试平台使用模拟授权请求中指定的属性值。

1. 选择**确认**，将该实体添加到测试平台。

1. 选择**运行授权请求**，模拟策略存储中 Cedar 策略的授权请求。测试平台会显示允许或拒绝该请求的决策，以及与满足条件的策略或评估期间遇到的错误有关的信息。

------
#### [ JSON mode ]

**要在 JSON 模式下测试策略，请按以下步骤操作：**

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

1. 在左侧导航窗格中，选择**测试平台**。

1. 选择 **JSON 模式**。

1. 在**请求详细信息**部分中，如果您定义了一个架构，请从该架构的主体类型中选择**执行操作的主体**。在文本框中为该主体输入一个标识符。

   如果未定义架构，请在**执行操作的主体**文本框中输入该主体。

1. 如果您定义了一个架构，请从该架构的资源类型中选择**资源**。在文本框中为该资源输入一个标识符。

   如果未定义架构，请在**资源**文本框中输入该资源。

1. 如果您定义了一个架构，请从指定主体和资源的有效操作列表中选择**操作**。

   如果未定义架构，请在**操作**文本框中输入该操作。

1. 在**上下文**字段中，输入要模拟的请求的上下文。该请求上下文是可用于授权决策的附加信息。

1. 在**实体**字段中，输入授权决策中要评估的实体及其属性的层次结构。

1. 选择**运行授权请求**，模拟策略存储中 Cedar 策略的授权请求。测试平台会显示允许或拒绝该请求的决策，以及与满足条件的策略或评估期间遇到的错误有关的信息。

------

# Amazon Verified Permissions 示例策略
<a name="policies-examples"></a>

此处包含的一些策略示例是基本的 Cedar 策略示例，有些则是特定于已验证权限的策略示例。基本内容链接到Cedar政策语言参考指南，并包含在那里。有关 Cedar 策略语法的更多信息，请参阅《Cedar 策略语言参考指南》中的 [Cedar 中的基本策略构造](https://docs.cedarpolicy.com/policies/syntax-policy.html)。

**策略示例**
+ [允许访问单个实体](https://docs.cedarpolicy.com/policies/policy-examples.html#allow-acces-indivuals)
+ [允许访问实体组](https://docs.cedarpolicy.com/policies/policy-examples.html#allow-acces-groups)
+ [允许任何实体进行访问](https://docs.cedarpolicy.com/policies/policy-examples.html#allow-any)
+ [允许访问实体的属性 (ABAC)](https://docs.cedarpolicy.com/policies/policy-examples.html#allow-abac)
+ [拒绝访问](https://docs.cedarpolicy.com/policies/policy-examples.html#deny-access)
+ [使用方括号表示法来引用代币属性](#policies-examples-brackets)
+ [使用点符号来引用属性](#policies-examples-dot)
+ [反映 Amazon Cognito ID 令牌属性](#policies-examples-cognito-id)
+ [反映 OIDC ID 令牌属性](#policies-examples-oidc-id)
+ [反映 Amazon Cognito 访问令牌属性](#policies-examples-cognito-access)
+ [反映 OIDC 访问令牌属性](#policies-examples-oidc-access)

## 使用方括号表示法来引用代币属性
<a name="policies-examples-brackets"></a>

以下示例说明如何创建使用方括号表示法来引用令牌属性的策略。

有关在已验证权限的策略中使用令牌属性的更多信息，请参阅[将 Amazon Cognito 令牌映射到架构](cognito-map-token-to-schema.md)和将 [OIDC 令牌映射到](oidc-map-token-to-schema.md)架构。

```
permit (
    principal in MyCorp::UserGroup::"us-west-2_EXAMPLE|MyUserGroup",
    action,
    resource
) when {
    principal["cognito:username"] == "alice" &&
    principal["custom:employmentStoreCode"] == "petstore-dallas" &&
    principal has email && principal.email == "alice@example.com" &&
    context["ip-address"] like "192.0.2.*"
};
```

## 使用点符号来引用属性
<a name="policies-examples-dot"></a>

以下示例说明如何创建使用点符号来引用属性的策略。

有关在已验证权限的策略中使用令牌属性的更多信息，请参阅[将 Amazon Cognito 令牌映射到架构](cognito-map-token-to-schema.md)和将 [OIDC 令牌映射到](oidc-map-token-to-schema.md)架构。

```
permit(principal, action, resource)
when {
    principal.cognito.username == "alice" &&
    principal.custom.employmentStoreCode == "petstore-dallas" &&
    principal.tenant == "x11app-tenant-1" &&
    principal has email && principal.email == "alice@example.com"
};
```

## 反映 Amazon Cognito ID 令牌属性
<a name="policies-examples-cognito-id"></a>

以下示例说明如何创建引用 ID 令牌属性的策略 Amazon Cognito。

有关在已验证权限的策略中使用令牌属性的更多信息，请参阅[将 Amazon Cognito 令牌映射到架构](cognito-map-token-to-schema.md)和将 [OIDC 令牌映射到](oidc-map-token-to-schema.md)架构。

```
permit (
    principal in MyCorp::UserGroup::"us-west-2_EXAMPLE|MyUserGroup",
    action,
    resource
) when {
    principal["cognito:username"] == "alice" &&
    principal["custom:employmentStoreCode"] == "petstore-dallas" &&
    principal.tenant == "x11app-tenant-1" &&
    principal has email && principal.email == "alice@example.com"
};
```

## 反映 OIDC ID 令牌属性
<a name="policies-examples-oidc-id"></a>

以下示例说明如何创建引用 OIDC 提供商的 ID 令牌属性的策略。

有关在已验证权限的策略中使用令牌属性的更多信息，请参阅[将 Amazon Cognito 令牌映射到架构](cognito-map-token-to-schema.md)和将 [OIDC 令牌映射到](oidc-map-token-to-schema.md)架构。

```
permit (
    principal in MyCorp::UserGroup::"MyOIDCProvider|MyUserGroup",
    action,
    resource
) when {
    principal.email_verified == true && principal.email == "alice@example.com" &&
    principal.phone_number_verified == true && principal.phone_number like "+1206*"
};
```

## 反映 Amazon Cognito 访问令牌属性
<a name="policies-examples-cognito-access"></a>

以下示例说明如何创建引用访问令牌属性的策略 Amazon Cognito。

有关在已验证权限的策略中使用令牌属性的更多信息，请参阅[将 Amazon Cognito 令牌映射到架构](cognito-map-token-to-schema.md)和将 [OIDC 令牌映射到](oidc-map-token-to-schema.md)架构。

```
permit(principal, action in [MyApplication::Action::"Read", MyApplication::Action::"GetStoreInventory"], resource)
when { 
    context.token.client_id == "52n97d5afhfiu1c4di1k5m8f60" &&
    context.token.scope.contains("MyAPI/mydata.write")
};
```

## 反映 OIDC 访问令牌属性
<a name="policies-examples-oidc-access"></a>

以下示例说明如何创建引用 OIDC 提供商的访问令牌属性的策略。

有关在已验证权限的策略中使用令牌属性的更多信息，请参阅[将 Amazon Cognito 令牌映射到架构](cognito-map-token-to-schema.md)和将 [OIDC 令牌映射到](oidc-map-token-to-schema.md)架构。

```
permit(
    principal, 
    action in [MyApplication::Action::"Read", MyApplication::Action::"GetStoreInventory"],
    resource
)
when { 
    context.token.client_id == "52n97d5afhfiu1c4di1k5m8f60" &&
    context.token.scope.contains("MyAPI-read")
};
```