authz-casbin

属性

note

你必须在插件配置中指定 model_pathpolicy_pathusername 或者指定 modelpolicyusername 才能使插件生效。

如果你想要使所有的 Route 共享 Casbin 配置,你可以先在插件元数据中指定 modelpolicy,在插件配置中仅指定 username,这样所有 Route 都可以使用 Casbin 插件配置。

名称类型必选项描述
modelstringCasbin 鉴权模型的文本定义。
policystringCasbin 鉴权策略的文本定义。

启用插件

你可以使用 model/policy 文件路径或使用插件 configuration/metadata 中的 model/policy 文本配置在 Route 上启用插件。

以下示例展示了通过 model/policy 配置文件来设置 Casbin 身份验证:

以下示例展示了通过你的 model/policy 文本来设置 Casbin 身份验证:

  1. curl http://127.0.0.1:9080/apisix/admin/routes/1 \
  2. -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
  3. {
  4. "plugins": {
  5. "authz-casbin": {
  6. "model": "[request_definition]
  7. r = sub, obj, act
  8. [policy_definition]
  9. p = sub, obj, act
  10. [role_definition]
  11. g = _, _
  12. [policy_effect]
  13. e = some(where (p.eft == allow))
  14. [matchers]
  15. m = (g(r.sub, p.sub) || keyMatch(r.sub, p.sub)) && keyMatch(r.obj, p.obj) && keyMatch(r.act, p.act)",
  16. "policy": "p, *, /, GET
  17. g, alice, admin",
  18. "username": "user"
  19. }
  20. },
  21. "nodes": {
  22. "127.0.0.1:1980": 1
  23. },
  24. "type": "roundrobin"
  25. },
  26. "uri": "/*"
  27. }'

所有通过这种方式创建的 Route 都会带有一个带插件元数据配置的 Casbin enforcer。你也可以使用这种方式更新 model/policy,该插件将会自动同步最新的配置信息。

  1. curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/authz-casbin \
  2. -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -i -X PUT -d '
  3. {
  4. "model": "[request_definition]
  5. r = sub, obj, act
  6. [policy_definition]
  7. p = sub, obj, act
  8. [role_definition]
  9. g = _, _
  10. [policy_effect]
  11. e = some(where (p.eft == allow))
  12. [matchers]
  13. m = (g(r.sub, p.sub) || keyMatch(r.sub, p.sub)) && keyMatch(r.obj, p.obj) && keyMatch(r.act, p.act)",
  14. "policy": "p, *, /, GET
  15. g, alice, admin"
  16. }'

更新插件元数据后,可以将插件添加到指定 Route 中:

authz-casbin - 图2note

插件路由的配置比插件元数据的配置有更高的优先级。因此,如果插件路由的配置中存在 model/policy 配置,插件将优先使用插件路由的配置而不是插件元数据中的配置。

首先定义测试鉴权模型:

  1. [request_definition]
  2. r = sub, obj, act
  3. [policy_definition]
  4. [role_definition]
  5. g = _, _
  6. [policy_effect]
  7. e = some(where (p.eft == allow))
  8. [matchers]
  9. m = (g(r.sub, p.sub) || keyMatch(r.sub, p.sub)) && keyMatch(r.obj, p.obj) && keyMatch(r.act, p.act)

然后添加测试鉴权策略:

  1. p, *, /, GET
  2. p, admin, *, *
  3. g, alice, admin

上述配置将允许所有人使用 GET 请求访问主页(/),而只有具有管理员权限的用户才可以访问其他页面并使用其他请求方法。

简单举例来说,假设我们向主页发出 GET 请求,通常都可以返回正常结果。

但如果是一个未经授权的普通用户(例如:bob)访问除 / 以外的其他页面,将得到一个 403 错误:

  1. curl -i http://127.0.0.1:9080/res -H 'user: bob' -X GET
  1. HTTP/1.1 403 Forbidden

而拥有管理权限的用户(如 alice)则可以访问其它页面。

禁用插件

当你需要禁用 authz-casbin 插件时,可以通过以下命令删除相应的 JSON 配置,APISIX 将会自动重新加载相关配置,无需重启服务:

  1. curl http://127.0.0.1:9080/apisix/admin/routes/1 \
  2. -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
  3. {
  4. "methods": ["GET"],
  5. "uri": "/*",
  6. "plugins": {},
  7. "upstream": {
  8. "type": "roundrobin",
  9. "nodes": {
  10. "127.0.0.1:1980": 1
  11. }
  12. }'