Casbin 是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型,注意,其只负责权限控制,没有用户管理的实现。
简介
权限管理的本质,是在询问 “某用户,对某资源,是否可以进行某操作” 。
Casbin 是一个强大、高效的访问控制库,支持常用的多种访问控制模型,如 ACL
RBAC
ABAC
等,可以实现灵活的访问权限控制,而且支持多种编程语言。
基本概念
Casbin 将访问控制模型抽象到一个基于 PERM (Policy Effect Request Matchers) 元模型的模型文件,如果要切换或更新授权机制只需要简单地修改配置文件即可,如下是基本概念介绍:
- Policy 策略,定义了具体的规则。
- Effect 根据对请求运用匹配器得出的所有结果进行汇总,来决定该请求是允许还是拒绝。
- Request 是对访问请求的抽象,它与
e.Enforce()
函数的参数是一一对应的 - Matcher 匹配器会将请求与定义的每个 policy 一一匹配,生成多个匹配结果。
在使用时包含了两个配置文件 model.conf
以及 policy.csv
,分别定义了具体的模型,以及配置的相关策略。
使用介绍
其中模型文件定义如下。
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
[policy_effect]
e = some(where (p.eft == allow))
request_definition
规定了权限由 sub
obj
act
三要素组成,分别是访问主体 Subject
、被访问的资源 Object
、访问方法 Action
,通常会使用这三个的简写。
policy_definition
用来定义策略列表中的顺序,在策略文件 policy.csv
中就可以定义 p, guest, /foobar, GET
等价于 p = guest, /foobar, GET
,表示 guest
用户可以以 GET
方法访问 /foobar
路径。
最后的匹配结果默认通过 p.eft
获取,默认是 allow
,也可以通过 p = sub, obj, act, eft
显示指定,这样规则文件最后一列就要显示指定 allow
或者 deny
了。
matchers
定义了请求与规则的匹配策略,也就是需要完全匹配。
policy_effect
当有多个策略时如何匹配,这里的规则是 e = some(where (p.eft == allow))
,也就意味着只要有一条匹配策略就表示允许。还有一种 e = some(where (p.eft == allow)) && !some(where (p.eft == deny))
规则表示存在一个规则是 allow
,而其它规则不能是 deny
。
然后,策略文件定义为。
p, andy, data1, read
p, lili, data2, write
上面 policy.csv
文件的两行内容表示 andy 对数据 data1 有 read 权限,而 lili 对数据 data2 有 write 权限。
示例详解
这里以 Casbin Example 为例。
参考
- Casbin Github 官方仓库地址。