Casbin 是什么?
官方解释:Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。
Casbin只负责访问控制。身份认证 authentication(即验证用户的用户名、密码),需要其他专门的身份认证组件负责。例如(jwt-go)
两个核心概念:
访问控制模型model和策略policy。
工作原理:
Casbin把 访问控制模型 被抽象为基于
PERM(Policy, Effect, Request, Matchers)模型很简单, 但是反映了权限的本质 – 访问控制
匹配来源:定义的 request 和 存储的 police 比对判断。
所有 model file 中主要就是定义 PERM 4 个部分。
的一个文件( model.conf , 这个文件一般是固定的)。 因此,切换或升级项目的授权机制与修改配置一样简单。 您可以通过组合可用的模型来定制您自己的访问控制模型(ACL, RBAC, ABAC)。 例如,您可以在一个model中获得RBAC角色和ABAC属性,并共享一组policy规则。
Casbin中最基本、最简单的model是ACL。ACL中的model CONF为:
# Request definition
[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
g, g2, g3 表示不同的 RBAC 体系, _, _ 表示用户和角色 _, _, _ 表示用户, 角色, 域(也就是租户)
ACL model的示例policy如下:
p, alice, data1, read
p, bob, data2, write
Model 语法:
Model CONF 至少应包含四个部分: [request_definition], [policy_definition], [policy_effect], [matchers]
。
如果 model 使用 RBAC, 还需要添加[role_definition]
部分
policy 不同,model 只能加载,不能保存。 因为我们认为 model 不是动态组件,不应该在运行时进行修改,所以我们没有实现一个 API 来将 model 保存到存储中.
定义具体的策略, 权限的检查就是基于定义的 model file 和 policy file 来完成的.
相对于 model file 定义规则, policy file 中定义的就是具体的内容.
如何使用?
创建一个Casbin决策器需要有一个模型文件和策略文件为参数:
import "github.com/casbin/casbin"
e := casbin.NewEnforcer("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 {
// permit alice to read data1
} else {
// deny the request, show an error
}
casbin 存储到数据库的记录是策略, 访问控制模型当系统确定户基本很少改动。可以存储到项目配置文件(本地)
casbin 存储RBAC方案中用户和角色之间的映射关系。(而这个关系是基于 midel 访问控制模型)
权限管理系统最好全局依赖 一个Casbin 决策器(这个决策器 依赖 模型文件和策略文件为参数)
在访问发生之前,在代码中加入强制钩子,控制。
这个请求格式是可以自定义的, 默认为默认的请求格式为 { subject, object , action }
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 {
// permit alice to read data1
} else {
// deny the request, show an error
}
Casbin 模型可以是多个组合。也可以共享同一组policy规则。
数据库里存储的 策略 第一个字段代表的是在 model 里定义的模型类型。
p, alice, data1, read 其中的 p 是在 model.conf 文件中定义好的。
[request_definition]
r = sub, dom, obj, act // 这里定义的是请求格式
[policy_definition]
p = sub, dom, obj, act // 这里定义的是策略格式模型
[role_definition]
g = _, _, _ // 这里定义的也是策略的一种模型
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act
Cabin 没有验证用户是否是有效的用户,或者角色是一个有效的角色。 这应该通过认证来解决。
参考资料:https://www.cnblogs.com/xiaohunshi/p/10372881.html
https://www.cnblogs.com/wang_yb/archive/2018/11/20/9987397.html
手机扫一扫
移动阅读更方便
你可能感兴趣的文章