
# 策略语法
该部分提供了用于在IAM中创建JSON策略的正式语法。提供此语法的目的是为了便于您理解如何构造和验证策略。
#### 策略的JSON视图
策略在IAM控制台中是以JSON视图表示的。当您创建或编辑JSON视图时，IAM可以执行策略验证以帮助您创建有效的策略。IAM可识别JSON语法错误，而IAM Access Analyzer将提供额外的策略检查和建议，以帮助您进一步优化策略。要了解有关IAM Access Analyzer策略检查的更多信息，请参见[验证自定义身份策略](https://support.huaweicloud.com/usermanual-iam5/iam_07_1015.html)。
一些基本的 JSON 规则介绍如下：
- 各实体间允许使用空格。
- 值使用引号括起来。
- 大部分 JSON 元素可以采用 JSON 数组作为值。数组可以采用一个或多个值。如果包含多个值，则数组用方括号 (\[ 和 \]) 括起来并用逗号分隔，如以下示例中所示：
  ```
  "Action": ["iam:users:createUserV5", "iam:users:getUserV5", "iam:users:listUsersV5", "iam:users:deleteUserV5"]
  ```
  
- 基本JSON数据类型 (布尔型、数字和字符串) 需符合RFC 7159中的定义。
 
 #### 策略语法约定
[策略语法]采用以下约定：
- 以下字符是JSON的结构字符，包含在策略中： { } \[ \] " , :
  
- 以下字符是策略语法中的特殊字符，用于策略语法的辅助描述，不包含在策略中： = \< \> ( ) \|
  
- 当一个元素允很多个值时，使用重复值、逗号分隔符和省略号 (...) 进行表示。示例： \[\<action_string\>, \<action_string\>, ...\]
  允许多个值时，只包含一个值也是有效的。只有一个值时，尾部不能添加逗号。
  
- 元素后的问号 (?) 表示该元素是可选的。示例： \<sid_block?\>
  
- 元素之间的竖线 (\|) 表示可选项。在语法中，小括号定义了可选项的范围。示例： ("Action" \| "NotAction")
  
- 必须为字符串的元素括在双引号 (") 中。示例： \<version_block\> = "Version" : ("5.0")
  
 
 #### 策略语法
下面示例描述了完整的策略语法。有关此示例中采用的约定，请参见[策略语法约定]。有关更多信息，请参见[策略语法说明]。
```
policy = {
  <version_block>,
  <statement_block>
}
<version_block> = "Version" : ("5.0")
<statement_block> = "Statement" : [ <policy_statement>, <policy_statement>, ... ]
<policy_statement> = {
  <sid_block?>,
  <effect_block>,
  <action_block>,
  <resource_block?>,
  <condition_block?>
}
<sid_block> = "Sid" : <sid_string>
<effect_block> = "Effect" : ("Allow" | "Deny")
<action_block> = ("Action" | "NotAction") : [ <action_string>, <action_string>, ... ]
<resource_block> = "Resource" : [ <resource_string>, <resource_string>, ... ]
<condition_block> = "Condition" : { <condition_map> }
<condition_map> = {
  <condition_type_string> : { <condition_key_string> : <condition_value_list> },
  <condition_type_string> : { <condition_key_string> : <condition_value_list> },
  ...
}
<condition_value_list> = ( <condition_value> | [ <condition_value>, <condition_value>, ... ] )
<condition_value> = "string"
```
 #### 策略语法说明
- 身份策略整体的大小不能超过6144字节数。
- 一个策略可以包含一组statement。
- 单个元素不能包含同一个键的多个实例。例如，不能在同一statement中包含两个Effect块。
- 各个块的描述顺序没有影响。例如，在身份策略中，effect_block、principal_block、action_block 在statement中可以按照任何顺序进行描述。
- principal_block 元素应该包含在资源策略中（例如，OBS的桶策略和IAM的信任策略），而不会出现在身份策略中。
- 每个字符串值 (sid_string、action_string、resource_string、condition_key_string 、condition_type_string) 都有其自己要求的格式或允许的值。
 
#### 字符串值的说明
该部分提供了在策略的不同元素中使用的字符串值的详细信息。
- **action_string**
  授权项（Action）是三段式的，大小写不敏感，格式为：
  \<service-name\>:\<type-name\>:\<action-name\>
  - service-name：云服务简称，例如 'ecs'，'vpc'；
  
  - type-name：云服务资源类型名称；
  
  - action-name：操作名称。
  
  
  在action_string中也可以使用通配符，示例如下：
  ```
  "Action": [
      "iam:users:createUserV5",
      "iam:users:getUserV5",
      "iam:users:listUsersV5",
      "iam:users:deleteUserV5"
  ]
  "Action": [
      "IAM:*:*"
  ]
  "Action": [
      "*"
  ]
  ```
  
- **sid_string**
  用于标识单个Statement，示例如下：
  ```
  "Sid": "11" 
  "Sid": "ThisStatementID"
  ```
  
- **resource_string**
  表示资源URN，要了解URN的更多信息，请参见[使用URN标识华为云资源](https://support.huaweicloud.com/usermanual-iam5/iam_01_1275.html)。您可以在URN的资源部分使用通配符，示例如下：
  ```
  "Resource": [
      "iam:*:*:user:*"
  ]
  ```
  
- **condition_type_string**
  标识条件的类型，例如 StringEquals和Bool 等。有关条件类型的完整列表，请参见JSON元素参考中的[运算符](https://support.huaweicloud.com/usermanual-iam5/iam_01_1289.html#iam_01_1289__li13495143171719)。
  ```
  "Condition": {
      "StringEquals": {
          "g:UserName": [
      "bob"
  ]
      }
  }
  ```
  
- **condition_key_string**
  表示条件键，例如iam:ResourceIsRootUser等。条件键分为全局条件键和服务级条件键，全局级条件键（前缀为g:）适用于所有操作，有关全局条件键的完整列表，请参见[全局条件键](https://support.huaweicloud.com/usermanual-iam5/iam_01_1287.html)；服务级条件键（前缀为服务缩写）仅适用于对应服务的操作，请参见[身份策略授权参考](https://support.huaweicloud.com/usermanual-permissions/iam_01_0003.html)，然后打开指定云服务的章节，并导航至"条件"小节。
  ```
  "Condition": {
      "Bool": {
          "iam:ResourceIsRootUser": [
              "true"
          ]
      }
  }
  ```
  
- **condition_value_list**
  标识 condition_key_string 的值，该值决定了是否满足条件。有关条件类型的值的说明，请参见JSON元素参考中的[运算符](https://support.huaweicloud.com/usermanual-iam5/iam_01_1289.html#iam_01_1289__li13495143171719)。
  ```
  "Condition": {
      "ForAllValues:StringEquals": {
          "g:UserName": [
              "bob",
              "alice"
          ]
      }
  }
  ```
  
 
