Azure API 管理策略:无法添加条件来检查字符串是否为空

问题描述 投票:0回答:1

我正在添加 API 策略,我已启用许多 API,并且想要添加 API 特定策略。我根据配置文件中发送的 API 所有者请求添加速率限制,有些 API 提供速率限制,有些则不提供。同时 API 也使用不同的身份验证(JWT 或 subscription_id)。我想在策略中添加条件,即如果 API 所有者给出了速率限制,并且 API 通过 jwt/subscription_id 进行了验证,则添加给定的速率限制,如果没有,则不执行任何操作。我尝试了下面的代码

<policies>
     <inbound>
       <set-variable name="isjwt" value="@(context.Request.Headers.GetValueOrDefault('Authorization', '').AsJwt()?.Subject)" />
       <set-variable name="isSubId" value="@(context.Subscription.Id)" />
           
       <choose>
          <when condition="(${var.api.rate_limit} != "" and (context.Variables["isjwt"] != null or context.Variables["isSubId"] != null))">
              <rate-limit-by-key calls=${var.api.rate_limit} renewal-period="60" counter-key="@(context.Variables["isjwt"] ?? context.Variables["isSubId"])" />
           </when>
        </choose>
       </inbound>
       <backend>
       <base />
       </backend>
       <outbound>
       <base />
       </outbound>
       <on-error>
       <base />
       </on-error>
      </policies>
               
               
variable "api" {
    type = object({
    name = string
    rate_limit = string
    })
}

地形计划看起来像这样

      +         <set-variable name="isAuthenticated" value="@(context.Request.Headers.GetValueOrDefault('Authorization', '').AsJwt()?.Subject)" />
  +         <set-variable name="hasSubscriptionId" value="@(context.Subscription.Id)" />
  + 
  +         <choose>
  +          <when condition="( != ""  and (context.Variables["isjwt"] != null or context.Variables["isSubId"] != null))">
  +               <rate-limit-by-key calls="" renewal-period="60" counter-key="@(context.Variables["isjwt"] ?? context.Variables["isSubId"])" />
  +           </when>
  +         </choose>

我在条件下遇到错误

var.api.rate_limit != ""
我尝试添加单引号它没有帮助,

错误:创建/更新 Api 策略:(策略名称“xml”/Api 名称“APINAME”/服务名称“SERVICENAME”/资源组“RGNAME”):apimanagement.APIPolicyClient#CreateOrUpdate:响应请求失败:StatusCode=400 - - 原始错误:autorest/azure:服务返回错误。 Status=400 Code="ValidationError" Message="一个或多个字段包含不正确的值:" 详细信息=[{"code":"ValidationError","message":"名称不能以 '"' 字符开头,十六进制值 0x22 。第 36 行,位置 52.","target":"representation"}]

azure azure-api-management terraform-provider-azure policy
1个回答
0
投票

Azure API 管理策略:无法添加条件来检查字符串是否为空:-

使用以下修改后的政策来解决您的报价冲突(

"
)。

resource  "azurerm_api_management_api_operation_policy"  "example"  {
  api_name = azurerm_api_management_api_operation.example.api_name
  api_management_name = azurerm_api_management_api_operation.example.api_management_name
  resource_group_name = azurerm_api_management_api_operation.example.resource_group_name
  operation_id = azurerm_api_management_api_operation.example.operation_id
xml_content = <<XML
<policies>
  <inbound>
    <set-variable name="isjwt" value="@(context.Request.Headers.GetValueOrDefault('Authorization', '').AsJwt()?.Subject)" />
    <set-variable name="isSubId" value="@(context.Subscription.Id)" />
           
    <choose>
      <when condition='(${var.api.rate_limit} != "" and (context.Variables["isjwt"] != null or context.Variables["isSubId"] != null))'>
        <rate-limit-by-key calls="${var.api.rate_limit}" renewal-period="60" counter-key="@(context.Variables["isjwt"] ?? context.Variables["isSubId"])" />
      </when>
    </choose>
  </inbound>
  <backend>
    <base />
  </backend>
  <outbound>
    <base />
  </outbound>
  <on-error>
    <base />
  </on-error>
</policies>
XML
}

参考terraform注册表中的

azurerm_api_management_api_operation_policy
模板,我尝试通过添加上述策略来部署您的需求,并且成功运行,如下所示。

enter image description here

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.