a6-plugin-consumer-restriction
概述
Apache APISIX 的 consumer-restriction 插件可根据已认证消费者的身份,限制其访问路由或服务。它支持三种限制类型和三种匹配模式:黑名单、白名单和按方法限制。
优先级:2400
该插件在认证插件之后的 access 阶段运行。
前提条件
必须与认证插件(如 key-auth、basic-auth、jwt-auth、hmac-auth、wolf-rbac)配合使用,以识别消费者。
适用场景
- 限制特定路由仅供指定消费者访问。
- 实现分级访问控制,例如免费消费者和高级消费者。
- 控制每个消费者可以使用的 HTTP 方法。
- 限制消费者只能访问指定服务或路由。
插件配置参考
| 字段 | 类型 | 是否必填 | 默认值 | 描述 |
|---|---|---|---|---|
type | string | 否 | consumer_name | 限制类型:consumer_name、consumer_group_id、service_id 或 route_id |
whitelist | 字符串数组 | 三者之一* | — | 允许的标识符 |
blacklist | 字符串数组 | 三者之一* | — | 拒绝的标识符 |
allowed_by_methods | 对象数组 | 三者之一* | — | 按消费者限制 HTTP 方法 |
allowed_by_methods[].user | string | 否 | — | 消费者用户名 |
allowed_by_methods[].methods | 字符串数组 | 否 | — | 允许的 HTTP 方法:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、CONNECT、TRACE、PURGE |
rejected_code | integer | 否 | 403 | 被拒绝请求的 HTTP 状态码(≥ 200) |
rejected_msg | string | 否 | "The {type} is forbidden." | 自定义拒绝消息 |
* 必须至少配置 whitelist、blacklist 或 allowed_by_methods 中的一项。
判定优先级
blacklist (highest) > whitelist > allowed_by_methods (lowest)
- **黑名单:**消费者匹配时,立即返回 403。
- **白名单:**消费者不在白名 单中时会被拒绝,除非
allowed_by_methods允许该请求。 - **allowed_by_methods:**消费者使用的方法不在允许列表中时会被拒绝。
限制类型的配置位置
| 类型 | 配置位置 | 描述 |
|---|---|---|
consumer_name | 路由/服务 | 限制可访问此路由的消费者 |
consumer_group_id | 路由/服务 | 限制可访问此路由的消费者组 |
service_id | 消费者 | 限制此消费者可访问的服务 |
route_id | 消费者 | 限制此消费者可访问的路由 |
分步示例
1. 按消费者名称配置白名单
仅允许 jack1 访问该路由:
# Create consumers with auth
a6 consumer create -f - <<'EOF'
{
"username": "jack1",
"plugins": {
"key-auth": {"key": "jack1-key"}
}
}
EOF
a6 consumer create -f - <<'EOF'
{
"username": "jack2",
"plugins": {
"key-auth": {"key": "jack2-key"}
}
}
EOF
# Create route with restriction
a6 route create -f - <<'EOF'
{
"id": "restricted",
"uri": "/api/*",
"plugins": {
"key-auth": {},
"consumer-restriction": {
"whitelist": ["jack1"]
}
},
"upstream": {
"type": "roundrobin",
"nodes": {"backend:8080": 1}
}
}
EOF
curl -H 'apikey: jack1-key' /api/data→ 200 OKcurl -H 'apikey: jack2-key' /api/data→ 403{"message":"The consumer_name is forbidden."}