Kong API Gateway特定API密钥自定义逻辑实现方案咨询
Kong API Gateway 自定义API密钥权限控制方案
完全可以通过自定义Kong插件实现你的需求,Kong的插件扩展机制天生支持这类定制化的权限控制场景。以下是具体的方案建议:
一、核心设计思路
- 绑定密钥与自定义规则:利用Kong的
Consumer关联API密钥,同时为每个Consumer(或直接为API密钥)附加自定义配置字段,存储允许访问的前端URL白名单、拦截规则等信息;推荐用Kong内置的metadata字段存储,无需额外修改数据库表结构。 - 请求拦截校验:在插件的
access阶段(请求转发至后端前)执行校验逻辑:- 从请求中提取API密钥,匹配到对应的Consumer记录
- 读取该Consumer绑定的前端URL白名单规则
- 校验当前请求的Referer(或自定义来源标识)是否在白名单内,不符合则直接返回403 Forbidden
二、插件开发关键步骤
- 初始化插件项目
使用Kong官方插件模板生成基础结构:kong plugin new url_restrict_key --v2 - 定义配置Schema
在schema.lua中声明插件的可配置字段,确保能关联到Consumer并存储白名单规则:return { name = "url_restrict_key", fields = { { consumer = { type = "consumer", required = true } }, { config = { type = "record", fields = { { allowed_referers = { type = "array", elements = { type = "string" }, required = true } }, { block_unlisted = { type = "boolean", default = true } } } } } } } - 实现校验逻辑
在handler.lua的access方法中编写核心校验代码:local plugin = require("kong.plugins.base_plugin"):extend() function plugin:new() plugin.super.new(self, "url_restrict_key") end function plugin:access(conf) plugin.super.access(self) local referer = kong.request.get_header("Referer") local allowed = false if not referer then return kong.response.exit(403, { message = "Missing Referer header" }) end for _, allowed_url in ipairs(conf.allowed_referers) do if string.match(referer, allowed_url) then allowed = true break end end if not allowed then return kong.response.exit(403, { message = "Referer not allowed" }) end end return plugin - 安装与绑定配置
将插件打包安装到Kong后,通过Kong Admin API为指定Consumer绑定插件并传入白名单配置,比如:curl -X POST http://kong-admin:8001/consumers/{consumer-id}/plugins \ -H "Content-Type: application/json" \ -d '{"name": "url_restrict_key", "config": {"allowed_referers": ["https://app.example.com/*", "https://portal.example.com/*"]}}'
三、用户面板集成建议
你的专属用户面板可直接对接Kong Admin API实现以下功能:
- 创建API密钥:调用
/consumers接口创建用户,再调用/consumers/{consumer-id}/key-auth生成API密钥 - 配置白名单:提供可视化界面让用户添加/删除允许的前端URL,通过
/consumers/{consumer-id}/plugins接口更新插件配置 - 权限隔离:面板需确保用户只能操作自身对应的Consumer及插件配置,避免越权
四、优化方向
- 缓存优化:将Consumer的白名单配置缓存到Kong内存(利用
kong.cache),减少数据库查询次数 - 规则增强:支持通配符、正则表达式匹配,提升URL白名单的灵活性
- 审计日志:在插件中添加日志记录,记录拦截请求的密钥、来源URL等信息,便于后续审计
内容的提问来源于stack exchange,提问作者Sandeep Jaiswal
相关产品推荐
相关产品推荐

