跳转到主要内容

Kong 授权

kong-authz 是一个 Kong 插件,它借助 lua-casbin 完成请求授权。你可以像往常一样定义 model 和 policy;插件会在 Kong 路由上执行它们。

前置条件​

信息

默认情况下,policy 从文件加载。若要使用数据库存储的 policy,请安装 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 或全局级别配置此插件。

基于文件的 Policy 存储​

以基于文件的 policy 方式做全局配置:

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 的数据库 Policy 存储​

使用 LuaSQL adapter 为特定 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 的数据库 Policy 存储​

使用 4DaysORM adapter 为特定 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"

关于 policy 编写的详细说明,请参阅 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'

首次执行时,会根据指定的 model 和 policy 路径创建一个 Casbin Enforcer。只要出现的不是 500 错误,就表示配置成功。如果出现 500 错误,请检查 Kong 安装目录中的 error.log 文件。

相关资源​