Casbin初识

介绍

Casbin是一个开源的访问控制框架(类库),支持多种访问控制模型,例如RBAC、ACL等
支持多种开发语言 Go、Java、Node.js、PHP、Python、.NET、C++、Rust、Delphi、Lua
作用范围
  1. 自定义请求的格式,默认的请求格式为{subject, object, action}。
  2. 访问控制模型及其策略的存储。
  3. 支持RBAC中的多层角色继承,不止主体可以有角色,资源也可以具有角色。
  4. 支持超级用户,如 root 或 Administrator,超级用户可以不受授权策略的约束访问任意资源。
  5. 支持多种内置的操作符,如 keyMatch,方便对路径式的资源进行管理,如 /foo/bar 可以映射到 /foo*。
无法实现的东西
  1. 身份认证 authentication(即验证用户的用户名、密码),casbin只负责访问控制。应该有其他专门的组件负责身份认证,然后由casbin进行访问控制,二者是相互配合的关系。
  2. 管理用户列表或角色列表。 Casbin 认为由项目自身来管理用户、角色列表更为合适, 用户通常有他们的密码,但是 Casbin的设计思想并不是把它作为一个存储密码的容器。 而是存储RBAC方案中用户和角色之间的映射关系。
通过抽离的三个维度 Model, Policy, Enforcer 来实现权限的控制,通过将权限配置存储到文件/数据库中,从而使切换或更新授权机制只需要简单地修改配置文件

Model就是一个配置文件,基于PERM metamodel (Policy, Effect, Request, Matchers),示例如下

[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))

Policy是动态存储policy rules的,可以存在.csv文件或数据库中,示例如下

p, dajun, data1, read
p, lizi, data2, write

Enforcer决定一个"subject"对一个"object"是否有"action"的权限。

php中使用

ACL实例
  1. 安装类库包
composer require casbin/casbin
  1. 创建模型文件 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
  1. 在需要进行访问控制的位置,通过以下代码进行权限验证
use Casbin\Enforcer;

$e = new Enforcer("path/to/model.conf", "path/to/policy.csv");

$sub = "alice"; 
$obj = "data1"; 
$act = "read"; 

if ($e->enforce($sub, $obj, $act) === true) {
    // 允许 alice 读取 data1
} else {
    // 拒绝请求, 显示错误
}
RBAC实例
  1. 安装类库包
composer require casbin/casbin
composer require casbin/database-adapter
  1. 创建模型文件 model.conf
[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

#  RBAC角色继承关系的定义
[role_definition]
g = _, _

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = g(r.sub, p.sub) && keyMatch2(r.obj, p.obj) && regexMatch(r.act, p.act)
  1. 权限使用
use Casbin\Enforcer;
use CasbinAdapter\Database\Adapter;

// 此处使用数据库来存储策略规则
$adapter = Adapter::newAdapter([
    'type'     => 'mysql', 
    'hostname' => '127.0.0.1',
    'database' => 'test',
    'username' => 'root',
]);

$enforcer = new Enforcer('path/to/model.conf', $adapter);

// 给alice和bob分配角色
$enforcer->addRoleForUser('alice', 'admin'); // 给alice分配admin角色
$enforcer->addRoleForUser('bob', 'member'); // 给bob分配member角色

// 给member角色分配权限,member 角色仅对foo资源有查看权限:
$enforcer->addPermissionForUser('member', '/foo', 'GET');
$enforcer->addPermissionForUser('member', '/foo/:id', 'GET');

// admin角色对foo拥有增删改查权限:
$enforcer->addRoleForUser('admin', 'member'); // Admin角色继承member角色的所有权限
$enforcer->addPermissionForUser('admin', '/foo', 'POST');
$enforcer->addPermissionForUser('admin', '/foo/:id', 'PUT');
$enforcer->addPermissionForUser('admin', '/foo/:id', 'DELETE');
  1. 分配完角色和权限后,数据库中的策略规则大致如下:
g, alice, admin
g, bob, member

p, memeber, /foo, GET
p, memeber, /foo/:id, GET

g, admin, member

p, admin, /foo, POST
p, admin, /foo/:id, PUT
p, admin, /foo/:id, DELETE
  1. 验证权限

alice 具有admin角色,继承adminmember两个角色的全部权限.

$enforcer->enforce('alice', '/foo', 'GET'); // true
$enforcer->enforce('alice', '/foo', 'GET'); // true

$enforcer->enforce('alice', '/foo', 'POST'); // true
$enforcer->enforce('alice', '/foo/1', 'PUT'); // true
$enforcer->enforce('alice', '/foo/1', 'DELETE'); // true

bob 具有member角色, 只继承member的权限.

$enforcer->enforce('bob', '/foo', 'GET'); // true
$enforcer->enforce('bob', '/foo', 'GET'); // true

$enforcer->enforce('bob', '/foo', 'POST'); // false
$enforcer->enforce('bob', '/foo/1', 'PUT'); // false
$enforcer->enforce('bob', '/foo/1', 'DELETE'); // false
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值