首页 > 应用开发 > IT综合 > 初识php权限管理系统之casbin
因为自己一直在尝试做一个自己的管理系统——枫叶系统。不可避免的要遇到权限管理上的问题,寻找了好久,发现casbin这个拓展确实牛逼(spatie 这个也很牛),所以准备好好学习下。
这个东西确实很强大,但是也比较难懂,难学,所以就逐步记录自己的学习过程,方便自己随时温故而知新吧

casbin——简单来说就是一个权限系统,它会回答谁(Subject)能对什么(Object)做什么(Action).我们用到了其中RBAC功能, 支持角色, 资源的多继承.
我们写的, casbin配置文件如下(model.conf):
[request_definition] r = sub, obj, act [policy_definition] p = sub, obj, act [role_definition] g = _, _ g2 = _, _ [policy_effect] e = some(where (p.eft == allow)) [matchers] m = g(r.sub, p.sub) && g2(r.obj, p.obj) && r.act == p.act
如果你没用过casbin, 或者是刚开始用, 上面的文件可能看起来不明白, 那我们来解析一下:
[request_definition] r = sub, obj, act
这是请求定义, 也就是在问casbin的时候, 请求应该具有的格式.
sub: subject, obj: object, act: action.
也就是在问: “谁(sub)对什么东西(obj)能做什么(act)?”
策略定义, 也就是你要将权限以什么格式来存储, 最直观的, 也就是和请求格式一样.
比如我们有一条策略:
p = om, cat, play
这条策略就表示tom对cat可以play, 也就是tom可以play cat.
当然这只是权限定义, 具体有没有权限还要看
[role_definition] g = _, _ g2 = _, _
开始看到这个真是很迷茫, 这什么玩意啊…
后来才明白, 其实这就是分组, 或者说定义从属关系.
当然这里的g专门用来划分角色, 如: g = tom, admin就可以表示tom的角色是admin.
而g2, g3, …, 完全可以自定义分组, 比如 g2 = 北京, 中国 就表示北京属于中国这样一个关系.
这个g, g2的也叫grouping policy, 可以说是分组策略(代码里有这个词, 比较贴切).
e = some(where (p.eft == allow))
这个就是说在判断权限时的结果有"allow"的, 就认为有权限, 否则没有权限.
至于如何判断权限, 就要看matchers了.
m = g(r.sub, p.sub) && g2(r.obj, p.obj) && r.act == p.act
这个matchers是什么东西呢? 你看它有r.xxx, p.xxx, 这r, p不就是上面定义的吗?
还有g, g2这些, 也是上面定义的.
单就刚才这个matcher来说, 我们自己想也大概能猜出来:
请求是: r = sub, obj, act,
我们存储的是: p = sub, obj, act,
判断权限时就看
r.sub是不是属于p.sub分组(r.sub有没有p.sub这个角色)
并且 r.obj是不是属于p.obj这个组的(资源分组)
并且r.act和p.act是不是一样(如都是GET)
总结
如果明白了casbin的配置文件, 那么其实它用起来也就很简单了.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69985427/viewspace-2728468/ ,如需转载,请注明出处,否则将追究法律责任。