Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。
Casbin 做了什么:
{subject, object, action}
。root
或 Administrator
,超级用户可以不受授权策略的约束访问任意资源。keyMatch
,方便对路径式的资源进行管理,如 /foo/bar
可以映射到 /foo*
。Casbin 不做的事情:
authentication
(即验证用户的用户名、密码),casbin
只负责访问控制。应该有其他专门的组件负责身份认证,然后由casbin
进行访问控制,二者是相互配合的关系。Casbin
认为由项目自身来管理用户、角色列表更为合适, 用户通常有他们的密码,但是 Casbin
的设计思想并不是把它作为一个存储密码的容器。而是存储RBAC方案中用户和角色之间的映射关系。Casbin中最核心的三个概念:Model
, Policy
, Enforcer
。
Model
就是一个CONF
文件,基于PERM metamodel (Policy, Effect, Request, Matchers)。
Policy
是动态存储policy rules
的,可以存在.csv
文件或数据库中。
Enforcer
决定一个"subject"对一个"object"是否有"action"的权限。
通过composer安装:
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决策器需要有一个模型文件和策略文件为参数:
require_once './vendor/autoload.php';
use Casbin\Enforcer;
$e = new Enforcer("path/to/model.conf", "path/to/policy.csv");
在需要进行访问控制的位置,通过以下代码进行权限验证:
$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 {
// 拒绝请求, 显示错误
}