1. 概述
存取控制外掛程式可以根據請求參數或上下文,來執行條件判斷,用於過濾不希望傳遞到後端的請求,參考參數與條件運算式的使用來瞭解如何定義參數和使用條件運算式。
2. 配置說明
在這個例子中假設我們的API請求Path為/{userId}/...
, API使用JWT認證,JWT中有userId和userType兩個claim, 我們這個外掛程式的校正條件為:
當userType=admin時,允許所有的路徑。
當userType=user時,僅允許/{userId}路徑一致的請求。
---
#
# 在這個例子中假設我們的API請求Path為`/{userId}/...`,
# API使用JWT認證,JWT中有userId和userType兩個claim
# 我們這個外掛程式的校正條件為
# - 當userType=admin時,允許所有的路徑,
# - 當userType=user時,僅允許/{userId}路徑一致的請求
parameters:
userId: "Token:userId"
userType: "Token:userType"
pathUserId: "path:userId"
#
# 關於Rules的處理規則,依次演算條件,按照傳回值為`true`或者`false`,處理`ifTrue`的邏輯或`ifFalse`的結果
# `ALLOW`會直接判斷為成功,而`DENY`則會直接返回錯誤碼給用戶端,
# 如果沒有觸發`ALLOW`或`DENY`邏輯,則執行下一條
rules:
- name: admin
condition: "$userType = 'admin'"
ifTrue: "ALLOW"
- name: user
condition: "$userId = $pathUserId"
ifFalse: "DENY"
statusCode: 403
errorMessage: "Path not match ${userId} vs /${pathUserId}"
responseHeaders:
Content-Type: application/xml
responseBody:
<Reason>Path not match ${userId} vs /${pathUserId}</Reason>
3. 參數存取控制外掛程式支援外掛程式資料集
參數存取控制外掛程式的配置和詳細說明參考參數存取控制外掛程式。
3.1. 建立外掛程式資料集
登入【API Gateway控制台】-【外掛程式管理】-【自訂資料集】建立資料集,並在資料集類型上選擇PARAMETER_ACCESS。
然後可以通過點擊資料集ID查看資料集中資料條目,點擊建立資料集條目可以添加參數值資料條目,資料值為參數存取控制中對應參數的參數值,並且可以給該資料條目設定到期時間。資料集中的資料條目在到達其到期時間後將自動失效。
外掛程式資料集只在專享執行個體生效,如果您配置了資料集的外掛程式所綁定的API不是配置在專享執行個體上,那麼外掛程式中配置的資料集將不生效。
3.2. 參數存取控制外掛程式配置外掛程式資料集
參數存取控制外掛程式中配置外掛程式資料集是在參數存取控制外掛程式中配置的基礎上,在rules集合元素中增加assertParameterName欄位和assertInDataset欄位。
assertParameterName:需要作為外掛程式資料集校正的參數名稱,該名稱需要在parameters中有定義。
assertInDataset:外掛程式資料集ID,會校正assertParameterName配置的參數對應的值是否在該資料集中。
assertParameterName和assertInDataset需要配對使用,否則建立外掛程式將會失敗。
這兩個欄位和condition是相互相容的,每個rule中可以同時配置(assertParameterName、assertInDataset)和condition,也可以單獨配置其中一個。如果同時配置了,則只需要命中其中一個即可。
---
#
# 在這個例子中假設我們的API請求Path為`/{userId}/...`,
# API使用JWT認證,JWT中有userId和userType兩個claim
# 我們這個外掛程式的校正條件為
# - 當userType=admin時,允許所有的路徑,
# - 當userType=user時,僅允許/{userId}路徑一致的請求
parameters:
userId: "Token:userId"
userType: "Token:userType"
pathUserId: "path:userId"
#
# 關於Rules的處理規則,依次演算條件,按照傳回值為`true`或者`false`,處理`ifTrue`的邏輯或`ifFalse`的結果
# `ALLOW`會直接判斷為成功,而`DENY`則會直接返回錯誤碼給用戶端,
# 如果沒有觸發`ALLOW`或`DENY`邏輯,則執行下一條
rules:
- name: byDataset
assertParameterName: userId
assertInDataset: 87b65008e92541938537b1a4a236eda5
ifTrue: "ALLOW"
- name: admin
condition: "$userType = 'admin'"
ifTrue: "ALLOW"
- name: user
condition: "$userId = $pathUserId"
ifFalse: "DENY"
statusCode: 403
errorMessage: "Path not match ${userId} vs /${pathUserId}"
responseHeaders:
Content-Type: application/xml
responseBody:
<Reason>Path not match ${userId} vs /${pathUserId}</Reason>
4. 相關錯誤碼
錯誤碼 | HTTP狀態代碼 | Message | 描述 |
A403AC | 403 | Access Control Forbidden by ${RuleName} | 被授權控制外掛程式阻止。 |
5. 使用限制
參數定義個數不超過160個。
單個運算式的字元數不超過1024個字元。
外掛程式配置大小限制為50KB。
最大允許的
rules
條數為160條。
當這個外掛程式綁定至共用執行個體API時,參數定義及rules只有前16條生效,綁定至專享執行個體API時全部生效)