参数访问控制

参数访问控制插件配置参考。

功能说明

param-access-control插件实现了基于请求参数和上下文条件进行精确访问控制,可用于实现复杂的请求验证和访问管理场景。

运行属性

  • 插件执行阶段:鉴权阶段。

  • 插件执行优先级:310。

配置字段

参数

数据类型

填写要求

默认值

描述

parameters

object

必填

-

定义需要使用的参数,支持从Header、Query、Path中提取。

rules

array of rule

必填

-

定义判断规则和处理逻辑。

parameters字段配置说明

参数

格式

描述

Header

Header:参数名

从请求头提取参数。

Query

Query:参数名

从查询参数提取参数。

Path

Path:序号

从路径中提取第n段内容,序号从1开始。

Path

Path

获取完整路径。

rules字段配置说明

参数

数据类型

填写要求

默认值

描述

name

string

必填

-

规则名称。

condition

string

必填

-

判断条件。

ifTrue

string

选填

-

条件为真时的处理指令(ALLOW/DENY)。

ifFalse

string

选填

-

条件为假时的处理指令(ALLOW/DENY)。

statusCode

number

选填

403

DENY时返回的HTTP状态码。

responseHeaders

object

选填

-

DENY时返回的响应头。

responseBody

string

选填

-

DENY时返回的响应体。

支持的运算符和函数

运算符/函数

描述

示例

==

等于

userType == 'admin'

!=

不等于

status != 'inactive'

>

大于

version > '2.0'

>=

大于等于

level >= '3'

<

小于

priority < '5'

<=

小于等于

quota <= '100'

contains

包含子串

path.contains('api')

matches

正则匹配

url.matches('*.jpg')

startsWith

前缀匹配

path.startsWith('/api')

endsWith

后缀匹配

filename.endsWith('.jpg')

&&

逻辑与

userType == 'admin' && level >= '3'

||

逻辑或

path.startsWith('/api') \|\| path.startsWith('/v2')

!

逻辑非

!(status == 'inactive')

配置示例

插件通过配置规则(rules)来控制请求访问,规则按照配置顺序依次执行直到遇到ALLOWDENY指令。每个规则必须至少配置ifTrueifFalse其中之一,建议为DENY操作设置明确的状态码和响应信息。以下示例展示了常见的使用场景:

基于用户身份的访问控制

parameters:
  userType: "Header:userType"
  userId: "Path:1"

rules:
  - name: admin-access
    condition: "userType == 'admin'"
    ifTrue: "ALLOW"
  - name: user-access
    condition: "userId == '123'"
    ifFalse: "DENY"
    statusCode: 403
    responseBody: "Access Denied"

根据该配置,满足以下条件的请求将被允许:

# 管理员访问任意路径
curl http://example.com/any/path? -H "userType: admin"

# 用户访问自己的资源
curl http://example.com/123/profile

而以下请求将被拒绝:

# 用户访问他人资源
curl http://example.com/456/profile

基于API版本的访问控制

parameters:
  apiVersion: "Header:Api-Version"
  path: "Path"

rules:
  - name: version-check
    condition: "path.contains('/v2/') && apiVersion < '2.0'"
    ifTrue: "DENY"
    statusCode: 400
    responseHeaders:
      Content-Type: application/json
    responseBody: '{"error": "Please upgrade to API version 2.0 or above"}'