【casbin】node-casbin入门

前言

  • 学nest时候翻到别人写的权限管理结合casbin搞得,所以要了解权限管理到底怎么写比较完美就要先学一下casbin。

官网

流程

  • 先照着他demo起个项目学下,混着别的东西学习效果不好。
  • 安装:
# NPM
npm install casbin --save

# Yarn
yarn add casbin
  • 开始使用时,我们需要2个模型文件 ,我们直接使用官方的rbac的样例文件做:
[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[role_definition]
g = _, _

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

[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
p, alice, data1, read
p, bob, data2, write
p, data2_admin, data2, read
p, data2_admin, data2, write
g, alice, data2_admin
import { newEnforcer } from "casbin";

async function test() {
	const e = await newEnforcer("./model.conf", "./policy.csv");

	const sub = "alice"; // the user that wants to access a resource.
	const obj = "data1"; // the resource that is going to be accessed.
	const act = "read"; // the operation that the user performs on the resource.

	if ((await e.enforce(sub, obj, act)) === true) {
		// permit alice to read data1
		console.log(true);
	} else {
		console.log(false);
		// deny the request, show an error
	}

	const roles = await e.getRolesForUser("alice");
	console.log(roles);
}

test();

  • 代码很短,主要就是修改sub obj act 来试验是否有权限,最后的roles可以获取角色权限。
  • 这个e是enforce实例,别的方法可以自行去看enfoce类的定义,感觉注释都有,写的还是很优雅的。
  • 这个打印结果:
true
[ 'data2_admin' ]
  • 也就是alice可以用read访问data1,角色里alice被分到data2admin里,所以最后取出来角色是data2admin。
  • p里第一行 alice data1 read 表明其可以读data1。
  • 第三行与第四行p 表明了data2admin具有data2的read和write权限。
  • 这样,我们试试alice读data2和写data2是不是true 。
  • 修改obj 为data2,act仍然为read ,得到结果true。
  • 修改act 为写,得到为true 。
  • 我们在policy里还定义了bob ,根据第二句话,bob只有data2的写权限。
  • 所以我们测试一下bob的所有权限。修改角色为bob 然后试验。
  • 答案不写了,反正跟预期一样。
  • 这个policy的p 对应了模型的p = sub, obj, act
  • 而这个g对应了模型的g = _, _,这个怪异符号可以理解为占位。role_definition只有要rbac或者更复杂才使用,否则不需要这个。每个g表示一个rbac系统。如果直接角色和用户绑定,那么就只要一个g就可以了。
  • 当存在g = _, _, _表示角色可能在不同域下为不同角色:
p, admin, tenant1, data1, read
p, admin, tenant2, data2, read

g, alice, admin, tenant1
g, alice, user, tenant2
  • 该实例表示tenant1的域内角色admin 可以读取data1, alice在tenant1域中具有admin角色,但在tenant2域中具有user角色, 所以alice可以有读取data1的权限。 同理,因为alice不是tenant2的admin,所以她访问不了data2。
  • 对于存在2个g的情况,即存在2个rbac系统时,一般用于需要相同角色不同资源访问的区分。
  • 这个policy_effect 只有下面几种:
some(where (p.eft == allow))	                                allow-override  ACL, RBAC, etc.
!some(where (p.eft == deny))	                                deny-override	Deny-override
some(where (p.eft == allow)) && !some(where (p.eft == deny))	allow-and-deny	Allow-and-deny
priority(p.eft) || deny	                                        priority	    Priority
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

业火之理

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值