跳转至主要内容

Kong 授权

kong-authz 是一个 Kong 插件,用 lua-casbin 对请求做授权。照常定义模型和策略,插件会在 Kong 路由上执行它们。

前提条件​

信息

默认从文件加载策略。要把策略存在数据库中,安装 4daysorm-adapter 或 luasql-adapter 之一。

安装​

安装 Casbin 的系统依赖:

  • 使用 apt 的系统:
sudo apt install gcc libpcre3 libpcre3-dev
  • 基于 Alpine 的系统:
sudo apk add gcc pcre pcre-dev libc-dev

从 LuaRocks 安装 Casbin 的最新版本:

sudo luarocks install casbin

安装 kong-authz 插件:

sudo luarocks install https://raw.githubusercontent.com/casbin-lua/kong-authz/master/kong-authz-0.0.1-1.rockspec

在 kong.conf 中把 kong-authz 追加到 plugins 变量(逗号分隔),添加该插件:

# kong.conf
plugins = bundled, kong-authz

启动或重启 Kong:

kong start [-c /path/to/kong.conf]

配置​

通过 Kong Admin API 在 service、API 或全局层级配置这个插件。

基于文件的策略存储​

使用基于文件的策略做全局配置:

curl -i -X POST \
--url http://localhost:8001/plugins/ \
--data 'name=kong-authz' \
--data 'config.model_path=/path/to/model_path.conf' \
--data 'config.policy_path=/path/to/policy_path.csv' \
--data 'config.username=user'

用 LuaSQL 把策略存在数据库中​

使用 LuaSQL 适配器为特定 service 配置:

curl -i -X POST \
--url http://localhost:8001/services/example-service/plugins/ \
--data 'name=kong-authz' \
--data 'config.model_path=/mnt/kong/examples/authz_model.conf' \
--data 'config.username=user' \
--data 'config.adapter=luasql' \
--data 'config.db_info.db_type=mysql' \
--data 'config.db_info.database=casbin' \
--data 'config.db_info.username=root' \
--data 'config.db_info.password=********' \
--data 'config.db_info.host=127.0.0.1' \
--data 'config.db_info.port=3306'

用 4DaysORM 把策略存在数据库中​

使用 4DaysORM 适配器为特定 service 配置:

curl -i -X POST \
--url http://localhost:8001/services/example-service/plugins/ \
--data 'name=kong-authz' \
--data 'config.model_path=/mnt/kong/examples/authz_model.conf' \
--data 'config.username=user' \
--data 'config.adapter=4daysorm' \
--data 'config.db_info.db_type=mysql' \
--data 'config.db_info.database=casbin' \
--data 'config.db_info.username=root' \
--data 'config.db_info.password=********' \
--data 'config.db_info.host=127.0.0.1' \
--data 'config.db_info.port=3306'

授权过程​

授权用 {subject, object, action} 评估请求,判断哪个 subject 能对哪个 object 执行哪个 action。在这个插件中:

  1. subject:请求头中传入的已登录用户名
  2. object:资源的 URL 路径(例如 "dataset1/item1")
  3. action:HTTP 方法(GET、POST、PUT、DELETE),或 "read-file"、"write-blog" 这样的自定义操作

编写策略的详细方法见 Casbin 文档。

配置示例​

为一个 service 配置 kong-authz 的完整示例:

  1. 创建一个示例 service:
curl -i -X POST \
--url http://localhost:8001/services/ \
--data 'name=example-service' \
--data 'url=http://mockbin.org'
  1. 为这个 service 创建路由:
curl -i -X POST \
--url http://localhost:8001/services/example-service/routes \
--data 'hosts[]=example.com'
  1. 应用 kong-authz 插件:
curl -i -X POST \
--url http://localhost:8001/services/example-service/plugins/ \
--data 'name=kong-authz' \
--data 'config.model_path=/path/to/authz_model.conf' \
--data 'config.policy_path=/path/to/authz_policy.csv' \
--data 'config.username=user'
  1. 发一个请求测试授权:
curl -i -X GET \
--url http://localhost:8000/ \
--header 'Host: example.com' \
--header 'user: anonymous'

首次执行时,会用指定的模型和策略路径创建一个 Casbin Enforcer。只要不是 500 错误,就说明配置成功。如果出现 500 错误,查看 Kong 安装目录中的 error.log 文件。

资源​