authz-casbin

描述

authz-casbin 是一个基于 Lua Casbin 的访问控制插件,该插件支持基于各种访问控制模型的授权场景。

有关如何创建鉴权模型和鉴权策略的详细文档, 请参阅 Casbin

属性

名称类型必选项默认值有效值描述
model_pathstring必须Casbin 鉴权模型配置文件路径
policy_pathstring必须Casbin 鉴权策略配置文件路径
modelstring必须Casbin 鉴权模型的文本定义
policystring必须Casbin 鉴权策略的文本定义
usernamestring必须描述请求中有可以通过访问控制的用户名

注意: 在插件配置中指定 model_pathpolicy_pathusername,或者在插件配置中指定 modelpolicyusername 来使插件生效。如果想要使所有的路由共享 Casbin 配置,可以先在插件元数据中指定鉴权模型和鉴权策略,然后在指定路由的插件配置中指定 username

元数据

名称类型必选项默认值有效值描述
modelstring必须Casbin 鉴权模型的文本定义
policystring必须Casbin 鉴权策略的文本定义

如何启用

该插件可以通过在任意路由上配置 鉴权模型/鉴权策略文件路径鉴权模型/鉴权策略文本 来启用。

通过配置文件启用

  1. curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
  2. {
  3. "plugins": {
  4. "authz-casbin": {
  5. "model_path": "/path/to/model.conf",
  6. "policy_path": "/path/to/policy.csv",
  7. "username": "user"
  8. }
  9. },
  10. "upstream": {
  11. "nodes": {
  12. "127.0.0.1:1980": 1
  13. },
  14. "type": "roundrobin"
  15. },
  16. "uri": "/*"
  17. }'

上述请求会根据鉴权模型/鉴权策略文件中的定义创建一个 Casbin enforcer。

通过路由配置启用

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

上述请求会根据鉴权模型和鉴权策略的定义创建一个 Casbin enforcer。

通过 plugin metadata 配置模型/策略

首先,使用 Admin API 发送一个 PUT 请求,将鉴权模型和鉴权策略的配置信息添加到插件的元数据中。所有通过这种方式创建的路由都会带有一个带插件元数据配置的 Casbin enforcer。同时也可以使用 PUT 请求更新鉴权模型和鉴权策略配置信息,该插件将会自动同步最新的配置信息。

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

通过发送以下请求可以将该插件添加到路由上。注意,此处只需要配置 username,不需要再增加鉴权模型/鉴权策略的定义。

  1. curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
  2. {
  3. "plugins": {
  4. "authz-casbin": {
  5. "username": "user"
  6. }
  7. },
  8. "upstream": {
  9. "nodes": {
  10. "127.0.0.1:1980": 1
  11. },
  12. "type": "roundrobin"
  13. },
  14. "uri": "/*"
  15. }'

注意: 插件路由配置比插件元数据配置有更高的优先级。因此,如果插件路由配置中存在鉴权模型/鉴权策略配置,插件将优先使用插件路由的配置而不是插件元数据中的配置。

测试插件

首先定义测试鉴权模型:

  1. [request_definition]
  2. r = sub, obj, act
  3. [policy_definition]
  4. p = sub, obj, act
  5. [role_definition]
  6. g = _, _
  7. [policy_effect]
  8. e = some(where (p.eft == allow))
  9. [matchers]
  10. 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 请求方法访问主页,返回正常。

  1. curl -i http://127.0.0.1:9080/ -X GET

未经授权的用户如 bob 访问除 / 以外的任何其他页面将得到一个 403 错误:

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

拥有管理权限的人 alice 则可以访问其它页面。

  1. curl -i http://127.0.0.1:9080/res -H 'user: alice' -X GET

禁用插件

在插件配置中删除相应的 json 配置,以禁用 authz-casbin 插件。由于 Apache APISIX 插件是热加载的,因此不需要重新启动 Apache APISIX。

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

示例

更多鉴权模型和鉴权策略使用的例子请参考 Casbin 示例