
# 身份策略变量
#### 身份策略变量介绍
在编写[Resource](https://support.huaweicloud.com/usermanual-iam5/iam_01_1289.html#iam_01_1289__section77391834161811)或[Condition](https://support.huaweicloud.com/usermanual-iam5/iam_01_1289.html#iam_01_1289__section1993511211268)的条件值时，可以使用身份[策略变量](https://support.huaweicloud.com/usermanual-iam5/iam_01_1289.html#iam_01_1289__section9427132217210)作为占位符。在实际鉴权的时候，这些占位符将会被自动替换成请求上下文中指定条件键的值。
#### 语法与替换规则
策略变量结构支持使用$前缀，后跟一对大括号{ }。在大括号内，包含想要使用的请求上下文中的条件键的名称，例如${g:UserName}，在实际鉴权的时候，${g:UserName}将被自动替换为条件键g:UserName的值。
![](https://support.huaweicloud.com/usermanual-iam5/public_sys-resources/warning_3.0-zh-cn.png)
如果指定条件键在请求上下文中不存在，或者指定条件键是多值条件键，那么将会替换失败，可能会导致整个语句无效。
例如当且仅当访问身份是IAM用户时，请求中才会存在g:UserName。如果以其它身份访问，那么所有包含${g:UserName}的资源和条件键都将视作不匹配。
同理，对于多值条件键g:CalledVia，即使它存在于请求上下文中，由于它是多值条件键，${g:CalledVia}依然会被判定为替换失败，从而视作不匹配。
如果变量指定的条件键替换失败，您可以为它提供原定设置文本作为默认值。要向变量添加默认值，请用单引号' '括起默认值，并用英文逗号和空格分隔条件键名称和默认值，例如${key, 'default'}，表示当key不存在或者替换失败时，将${key, 'default'}替换为文本串default。条件键名称不区分大小写，但是默认值区分大小写。此外，条件键名称与默认值引号前后的空格都会被忽略。例如${ g:username , 'Default_User_Name' }表示如果访问身份是IAM用户，则替换成g:UserName的值，否则替换成文本串Default_User_Name。
对于策略中具有特殊含义的字符："\*"（通配符）、"?"（通配符）、"$"（策略变量标识符），如果您不想让这三个字符表示这些特殊含义，请将它们改写为${\*}、${?}、${$}；此外，在策略变量默认值中，如果您想表达一个单引号字符（'），请使用一对连续的单引号（''）来表示。例如${g:UserName, 'A single quote is '', two quotes are ''''.'}，当使用默认值进行替换时，它将被替换成A single quote is ', two quotes are ''.
IAM只会进行一轮替换，这意味着即使替换完毕后包含新的策略变量结构，它仍然不会被替换。例如${g:UserName, '${g:UserName}${\*}'}，当使用默认值进行替换时，它将被替换成${g:UserName}${\*}，不会继续迭代。
#### 示例
**在资源中使用变量**
Config服务关联委托的预置身份策略，在资源中使用"iam::${g:DomainId}:agency:rms_tracker_agency_v5"来指定对应账号下的信任委托URN：
```
{
"Version": "5.0",
"Statement": [{
"Effect": "Allow",
"Action": [
"iam:agencies:attachPolicyV5",
"iam:agencies:detachPolicyV5"
],
"Resource": [
"iam::${g:DomainId}:agency:rms_tracker_agency_v5"
],
"Condition": {
"StringEquals": {
"iam:PolicyURN": "iam::system:policy:ConfigTrackAgencyPolicy"
}
}
}]
}
```
**在条件值中使用变量**
禁止跨组织访问资源：
```
{
"Version": "5.0",
"Statement": [{
"Effect": "Deny",
"Action": ["*"],
"Resource": ["*"],
"Condition": {
"StringNotEquals": {
"g:ResourceOrgId": "${g:PrincipalOrgId}"
},
"Null": {
"g:ResourceOrgId": "false"
}
}
}]
}
```
**与标签配合使用**
通过给每个IAM用户设置标签MaxAllowedMfaAge，使得该IAM用户仅能在经过多因素认证MaxAllowedMfaAge秒内才能调用IAM API，若未设置标签MaxAllowedMfaAge，则视作600秒：
```
{
"Version": "5.0",
"Statement": [{
"Effect": "Allow",
"Action": ["iam:*"],
"Condition": {
"NumberLessThanEquals": {
"g:MFAAge": "${g:PrincipalTag/MaxAllowedMfaAge, '600'}"
}
}
}]
}
```
