简介
一个支持多语言的权限管理、访问控制库。支持多种控制模型:
- RBAC(Role Based Access Control)
- ACL(Access Control List)
- ABAC(Attribute Based Access Control)
- …
Tutorial: https://casbin.org/docs/en/overview
模型
casbin的模型控制抽象到一个配置文件中, 主要包含:
- policy: 控制策略/规则
- request: 访问请求, 与e.Enforce()的参数一一对应
- matcher: 匹配器, 与定义的每个policy一一匹配会生成多个匹配结果
- effect: 根据匹配结果决定该请求是否获得授权
示例
# request的定义
# sub: 实体(subject), dom: 领域/租户(domain/tenant)
# obj: 资源(objcet), act: 访问方法(action)
[request_definition]
r = sub, dom, obj, act
# 根据request对照的规则
[policy_definition]
p = sub, dom, obj, act
# 规则的制定 可用于继承 第三个固定为domain/tenant
[role_definition]
g = _,_,_
# 根据多个policy对requst进行筛选后 对授权是否通过判断的一个匹配器
[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.obj
特性
优先级(Priority Model)
- 明确指定优先级
#model.conf
[policy_definition]
p = priority, sub, obj, act, eft
[role_definition]
g = _, _
# policy.csv
# 虽然jack继承了group的规则 且group是没有read权限
# 但是jack自身有read权限且priority=1比group中的要高(越小越高) 因此jack最终可以read data
p, 2, group, data, read, deny
p, 1, jack, data, read, allow
g, jack, group
- 层级继承优先级(Hierarchy Priority)
# policy.csv
# 越在继承层级上层的默认优先级越高 因此jack最终可以read data
p, group, data, read, deny
p, jack, data, read, allow
g, jack, group
思考🤔
在casbin提了几个issue, 主要是围绕在RBAC的做法下, 实现全局策略导致的一些问题:
-
如何设置全局策略,只在角色继承和赋予额外策略时再加上domain (已解决)
想这么做主要是为了减少policy文件的行数, 并使policy文件保持简洁性和可阅读性 -
在RBAC使用pattern-matching的情况下,获取用户被赋予和继承得来的所有策略不生效 (已解决)
在上一条使用pattern-matching解决后, 发现domainMatchingFunc并没有在获取策略的过程中被使用,导致了这个问题的产生 -
在LoadPolicy被调用时会发生协程间map读写冲突 (未解决)
存放casbin模型的map会出现迭代器和写的冲突,平常不怎么触发,但是一旦启用了watcher(其他实例更新,本实例会调用LoadPolicy),panic几率上升
PREVIOUSDocker
NEXTGolang Testing