参数访问控制插件

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网关控制台】-【插件管理】-【自定义数据集】创建数据集,并在数据集类型上选择PARAMETER_ACCESS

image.png

然后可以通过点击数据集ID查看数据集中数据条目,点击创建数据集条目可以添加参数值数据条目,数据值为参数访问控制中对应参数的参数值,并且可以给该数据条目设置过期时间。数据集中的数据条目在到达其过期时间后将自动失效。

image..png

重要

插件数据集只在专享实例生效,如果您配置的数据集的插件所绑定的API不是配置在专享实例上,那么插件中配置的数据集将不生效。

3.2. 参数访问控制插件配置插件数据集

参数访问控制插件中配置插件数据集是在参数访问控制插件中配置的基础上,在rules集合元素中增加assertParameterName字段和assertInDataset字段。

  • assertParameterName:需要作为插件数据集校验的参数名称,该名称需要在parameters中有定义。

  • assertInDataset:插件数据集ID,会校验assertParameterName配置的参数对应的值是否在该数据集中。

assertParameterNameassertInDataset需要配对使用,否则创建插件将会失败。

这两个字段和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条生效,绑定至Serverless实例时,参数定义及rules只有前160条生效,绑定至专享实例API时全部生效。