

# 政策條件
<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 { …​ }` - 政策僅在條件為 true 時才適用
+  `unless { …​ }` - 政策僅適用於條件為 false 的情況
+  `when guardrails { …​ }` - 只有在一或多個護欄的輸出上宣告的條件評估為 true 時 （政策） 才適用
+  `unless guardrails { …​ }` - 政策僅適用於在一或多個護欄的輸出上宣告的條件評估為 false (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 Gateway 設定的身分驗證類型而有所不同。

### OAuth 宣告 （標籤）
<a name="policy-oauth-claims"></a>

對於 OAuth 驗證的閘道，來自 OAuth 字符的 JWT 宣告會儲存為 OAuthUser 實體上的標籤。JWT 宣告範例：

```
{
  "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 驗證的閘道，委託人具有包含發起人的 IAM ARN 的`id`屬性。IAM 主體不支援標籤。

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

IAM 驗證閘道的 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 ==` 進行確切的角色比對。

#### 模式與 相符 `like`
<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 （所有條件都必須為 true)
+  `||` - OR （至少一個條件必須為 true)
+  `!` - NOT （否定條件）

範例：

```
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
```