政策條件
條件使用 when和 unless子句將精細邏輯新增至政策:
when { principal.hasTag("username") && principal.getTag("username") == "refund-agent" && context.input.amount < 500 }
條件類型
-
when { … }- 政策僅在條件為 true 時才適用 -
unless { … }- 政策僅適用於條件為 false 的情況 -
when guardrails { … }- 只有在一或多個護欄的輸出上宣告的條件評估為 true 時 (政策) 才適用 -
unless guardrails { … }- 政策僅適用於在一或多個護欄的輸出上宣告的條件評估為 false (false) 的情況
工具引數
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→「瑕疵產品」
政策可以根據特定工具呼叫參數做出決策。
主體屬性
主體屬性會根據為 AgentCore Gateway 設定的身分驗證類型而有所不同。
OAuth 宣告 (標籤)
對於 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 實體屬性
對於 IAM 驗證的閘道,委託人具有包含發起人的 IAM ARN 的id屬性。IAM 主體不支援標籤。
主體實體格式
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
您也可以使用 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"
邏輯運算子
使用邏輯運算子結合多個條件:
-
&&- 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