

# 策略条件
<a name="policy-conditions"></a>

条件使用`when`和`unless`子句为策略添加了细粒度的逻辑：

```
when {
  principal.hasTag("username") &&
  principal.getTag("username") == "refund-agent" &&
  context.input.amount < 500
}
```

## 条件类型
<a name="policy-condition-types"></a>
+  `when { …​ }`-只有条件为真时，政策才适用
+  `unless { …​ }`-政策仅在条件为假时适用
+  `when guardrails { …​ }`-只有在一个或多个护栏的输出上声明的条件评估为真时，政策才适用
+  `unless guardrails { …​ }`-只有在一个或多个护栏的输出中断言的条件评估为 false 时，政策才适用

## 工具参数
<a name="policy-tool-arguments"></a>

 `context.input`包含传递给工具调用的参数：

```
context.input.amount < 500
```

当用户使用以下参数调`RefundTool___process_refund`用时：

```
{
  "orderId": "12345",
  "amount": 450,
  "reason": "Defective product"
}
```

该策略可以访问以下值：
+  `context.input.orderId`→ “12345”
+  `context.input.amount`→ 450
+  `context.input.reason`→ “有缺陷的产品”

策略可以根据特定的工具调用参数做出决策。

## 主要属性
<a name="policy-principal-attributes"></a>

根据为 AgentCore 网关配置的身份验证类型，主体属性会有所不同。

### OAuth 声明（标签）
<a name="policy-oauth-claims"></a>

对于 OAuth-authenticated 网关，来自 OAuth 令牌的 JWT 声明将作为标签存储在实体上。 OAuthUser 智威汤逊声明示例：

```
{
  "sub": "user-123",
  "username": "refund-agent",
  "scope": "refund:write admin:read",
  "role": "admin"
}
```

这些索赔成为主体的标签。检查标签是否存在：

```
principal.hasTag("username")
```

获取标签值：

```
principal.getTag("username") == "refund-agent"
```

图案匹配：

```
principal.getTag("scope") like "*refund:write*"
```

### IAM 实体属性
<a name="policy-iam-attributes"></a>

对于 IAM-authenticated 网关，委托人有一个包含调用方的 IAM ARN 的`id`属性。IAM 委托人不支持标签。

#### 主体格式
<a name="policy-iam-principal-format"></a>

 IAM-authenticated 网关的 Cedar 主体是`AgentCore::IamEntity`。该`principal.id`属性包含来电者的 IAM ARN。

对于通过假设的 IAM 角色进行身份验证的呼叫者，`principal.id`和 Cedar 实体 ID 使用以下格式：

 `arn:aws:sts::<account-id>:assumed-role/<role-name>` 

例如，如果来电者担任该角色`MyServiceRole`，则 Cedar 实体 ID 为：

 `AgentCore::IamEntity::"arn:aws:sts::123456789012:assumed-role/MyServiceRole"` 

这种格式在所有调用中都是稳定的，因此您可以使用它进行精确`principal ==`的角色匹配。

#### 与 lik `e` 匹配的图案
<a name="policy-iam-pattern-matching"></a>

您也可以使用带通配`like`符的运算符进行更广泛的匹配：

```
// Match any role in a specific account
principal.id like "arn:aws:sts::123456789012:assumed-role/*"

// Match specific AWS account (any ARN format)
principal.id like "*:123456789012:*"

// Match a specific IAM role name across any account
principal.id like "arn:aws:sts::*:assumed-role/AdminRole"
```

## 逻辑运算符
<a name="policy-logical-operators"></a>

使用逻辑运算符组合多个条件：
+  `&&`-AND（所有条件都必须为真）
+  `||`-OR（至少有一个条件必须为真）
+  `!`-不是（否定条件）

示例：

```
principal.hasTag("username") &&              // User must have username tag
principal.getTag("username") == "refund-agent" &&  // Username must be "refund-agent"
context.input.amount < 500                   // Amount must be less than $500
```