概述
Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。
Casbin支持以下编程语言:
特性
Casbin 做了什么:
- 自定义请求的格式,默认的请求格式为
{subject, object, action}
。 - 访问控制模型及其策略的存储。
- 支持RBAC中的多层角色继承,不止主体可以有角色,资源也可以具有角色。
- 支持超级用户,如
root
或Administrator
,超级用户可以不受授权策略的约束访问任意资源。 - 支持多种内置的操作符,如
keyMatch
,方便对路径式的资源进行管理,如/foo/bar
可以映射到/foo*
。
Casbin 不做的事情:
- 身份认证
authentication
(即验证用户的用户名、密码),casbin
只负责访问控制。应该有其他专门的组件负责身份认证,然后由casbin
进行访问控制,二者是相互配合的关系。 - 管理用户列表或角色列表。
Casbin
认为由项目自身来管理用户、角色列表更为合适, 用户通常有他们的密码,但是Casbin
的设计思想并不是把它作为一个存储密码的容器。而是存储RBAC方案中用户和角色之间的映射关系。
工作原理
在 Casbin 中, 访问控制模型被抽象为基于**PERM (Policy, Effect, Request, Matcher)**的一个文件。因此,切换或升级项目的授权机制与修改配置一样简单。
您可以通过组合可用的模型来定制您自己的访问控制模型。例如,您可以在一个model中获得RBAC角色和ABAC属性,并共享一组policy规则。
Casbin中最基本、最简单的model
是ACL。ACL中的Model
CONF为:
# Request definition
[request_definition]
r = sub, obj, act
# Policy definition
[policy_definition]
p = sub, obj, act
# Policy effect
[policy_effect]
e = some(where (p.eft == allow))
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
ACLModel
的示例Policy
如下:
p, alice, data1, read
p, bob, data2, write
这表示:
- alice 对 data1 有读权限
- bob 对 data2 有写权限
对于过长的单行配置,您也可以通过在结尾处添加“”
进行断行:
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
此外,对于 ABAC,您在可以在 Casbin golang 和 php 版本中尝试下面的 (jCasbin 和 Node-Casbin 尚不支持)操作:
代码语言:javascript复制# Matchers
[matchers]
m = r.obj == p.obj && r.act == p.act || r.obj in ('data2', 'data3')
快速开始
Casbin 中最核心的三个概念:Model
,Policy
,Enforcer
。
Model
就是一个CONF
文件,基于PERM metamodel (Policy, Effect, Request, Matchers)。Policy
是动态存储policy rules
的,可以存在.csv
文件或数据库中。Enforcer
决定一个"subject"对一个"object"是否有"action"的权限。
安装
通过composer安装:
代码语言:javascript复制composer require casbin/casbin
配置
创建model.conf
和policy.csv
文件:
model.conf
配置
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
policy.csv
配置
p, alice, data1, read
p, bob, data2, write
创建一个Casbin决策器需要有一个模型文件和策略文件为参数:
代码语言:javascript复制require_once './vendor/autoload.php';
use CasbinEnforcer;
$e = new Enforcer("path/to/model.conf", "path/to/policy.csv");
在需要进行访问控制的位置,通过以下代码进行权限验证:
代码语言:javascript复制$sub = "alice"; // the user that wants to access a resource.
$obj = "data1"; // the resource that is going to be accessed.
$act = "read"; // the operation that the user performs on the resource.
if ($e->enforce($sub, $obj, $act) === true) {
// 允许 alice 读取 data1
} else {
// 拒绝请求, 显示错误
}