认识casbin
学习笔记:
概念:
casbin是一个什么东西?
- Casbin是一个权限控制系统,可以支持多种(ACL, RBAC, ABAC等)权限类型
我们最终需要实现的效果:
- 可以控制一人/角色(sub)能否对某个资源(obj)进行某种操作(act)
配置文件
配置文件一共有两个:model.file 和 policy.file ,一个是访问控制模型,一个是权限注册表。
-
model.conf
# 定义了请求格式 [request_definition] r = sub, obj, act [policy_definition] p = sub, obj, act # 此处设置为 RBAC 类型 “用户” , “角色”, 主要在matchers中使用 是用于 用户角色分配或者是 资源的继承 [role_definition] g = _, _ # Policy effect 定义了什么情况下这个请求是被允许的 [policy_effect] e = some(where (p.eft == allow)) # Matchers //定义了如何将请求和权限相匹配 [matchers] m = (g(r.sub, p.sub) || p.sub == "*") && keyMatch(r.obj, p.obj) && (r.act == p.act || p.act == "*")
Casbin使用PERM来描述一种模型(Policy、Effect、Request、Matcher),其中:
- sub:Subject——表示Request中的accessing entity,即 “是谁” 发起的请求
- obj :Object——表示Request中的accessed resource,即被请求访问 “目标资源”
- act :Action——表示Request中的access method, 即请求要对资源 “做什么”
-
policy.file
p, anonymous, /, GET p, admin, /*, * p, anonymous, /admin*, GET p, anonymous, /admin*, POST
第一行定义了一个权限:anonymous(用户 || 组 || 角色) 对/ 拥有 get 行为
工作原理
enforcer = casbin.Enforcer("casbin_middleware/authz_model.conf", "casbin_middleware/authz_policy.csv")
enforcer.enforcer(sub, obj, act)
举个栗子:比如说 anonymous 想要 GET 请求 / 路径
- 由于在model.file 中我们定义了传入参数的格式:应该传入的就是
("anonymous", "/admin", "GET")
分别对应了 r.sub, r.obj, r.act - 在 policy.file 中我们也定义了 policy 的格式,所以当我们从 policy file 中读取一行数据的时候,分别就对应了 p.sub, p.obj, p.act
- 最后根据 matcher所定义的规则,将请求和权限进行匹配,若是某个规则匹配了 那么
p.eft = allow
- r.sub == p.sub 满足条件的有三条权限(1, 3, 4 )
- r.obj == p.obj 剩下的三条权限中满足条件的有两条(3, 4)
- r.act == p.act 剩下的两条权限中满足条件的有一条(4)
复杂一些
例1. 用户alice和bob同属于一个名为admin的角色(分组),而admin角色可以对 “/v1”路径下的所有资源进行任何操作!
model.file
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub) && keyMatch(r.obj, p.obj) && (r.act == p.act || p.act == "*")
policy file:
p, admin, /v1/*, *
g, alice, admin
g, bob, admin
加一个超级管理员?
[matchers]
m = g(r.sub, p.sub) && keyMatch(r.obj, p.obj) && (r.act == p.act || p.act == "*")|| r.sub == "root"
扩展补充
在[role_definition]中,g有两种不同的写法:
g = _, _ 表示用户,角色
g2 = _, _, _ 表示用户,角色,域
Matcher中的函数
matcher内置了若干个函数来支持开发者更好的定制自己的模型,甚至可以使用我们自定义的函数。当前支持的函数如下:
函数 释义
keyMatch(arg1, arg2)
,arg1为URL,如/v1/admin/file
,arg2为URL 或 模板,如:/v1/admin/
,返回 arg1 是否与 arg2 相匹配keyMatch2(arg1, arg2)
,arg1为URL,如/v1/admin/file2
,arg2为URL或模板,如:/v1/admin/:file
,返回 arg1 是否与 arg2 相匹配regexMatch(arg1, arg2)
, arg1为任意字符串,arg2为正则表达式,返回arg1是否与arg2相匹配ipMatch(arg1, arg2)
,arg1为IP地址 如192.168.12.42
,arg2为iP地址或CIDR如192.168.12. 0/24
,返回arg1是否与arg2相匹配