Casbin
下方内容主要来源官方文档
在Casbin中,访问控制模型被抽象为基于**PERM元模型(策略,效果,请求,匹配器)**的CONF文件。 为项目切换或升级授权机制就像修改配置一样简单。 您可以通过组合可用模型来定制自己的访问控制模型。 例如,您可以在一个模型内部将RBAC角色和ABAC属性结合在一起,并共享一套策略规则。
PERM模型由四个基础部分组成:策略,效果,请求和匹配器。 这些基础部分描述了资源和用户之间的关系。
sub, obj, act, eft含义如下:
- sub:subject,访问实体;
- obj: object,访问的资源;
- act: action,访问方法;
- eft: effect,策略结果,一般为空,默认指定allow,还可以定义为deny。
Request
定义请求参数。 基本请求是一个元组对象,至少需要一个主体(被访问实体sub),对象(被访问资源obj)和动作(访问方法act)。
例如,请求定义可能看起来像这样:r={sub,obj,act}
此定义指定了访问控制匹配函数所需的参数名称和顺序。
Policy
定义访问策略的模型。 它指定了策略规则文档中字段的名称和顺序。
例如:p={sub, obj, act}
或 p={sub, obj, act, eft}
注意:如果未定义eft(策略结果),则不会读取策略文件中的结果字段,匹配策略结果将默认允许。
Matcher
定义请求和策略的匹配规则。
例如:m = r.sub == p.sub && r.act == p.act && r.obj == p.obj
这个简单而常见的匹配规则意味着,如果请求的参数(实体,资源和方法)等于策略中找到的那些,那么返回策略结果(p.eft
)。 策略的结果将保存在p.eft
中。
Effect
对匹配器的匹配结果进行逻辑组合判断。
例如:e = some(where(p.eft == allow))
这个语句意味着,如果匹配策略结果p.eft
有(一些)允许的结果,那么最终结果为真。
让我们看另一个例子:
e = some(where (p.eft == allow)) && !some(where (p.eft == deny))
这个例子组合的逻辑意义是:如果有一个策略匹配到允许的结果,并且没有策略匹配到拒绝的结果,结果为真。 换句话说,当匹配策略都是允许时,结果为真。 如果有任何拒绝,两者都为假(更简单地说,当允许和拒绝同时存在时,拒绝优先)。
Casbin是如何工作的?
在深入实现之前,理解Casbin是什么以及它在高层次上如何运作是很重要的。 这种理解是必要的,因为每个基于角色的访问控制(RBAC)系统可能会根据特定的需求有所不同。 通过掌握Casbin的工作原理,我们可以有效地调整模型。
什么是ACL?
ACL代表访问控制列表。 这是一种将用户映射到操作和操作映射到资源的方法。
模型定义
让我们考虑一个简单的ACL模型示例。
[request_definition] r = sub, act, obj [policy_definition] p = sub, act, obj [policy_effect] e = some(where (p.eft == allow)) [matchers] m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
-
request_definition是系统的查询模板。
例如,一个请求alice, write, data1
可以被解释为"主体Alice能否对对象'data1'执行'write'操作?"。 -
policy_definition
是系统的分配模板。
例如,通过创建一个策略alice, write, data1
,你就赋予了主体Alice在对象'data1'上执行'write'操作的权限。 -
policy_effect
定义了策略的效果。 -
在
matchers
部分,请求使用条件r.sub == p.sub && r.obj == p.obj && r.act == p.act
与策略进行匹配。
什么是RBAC?
RBAC代表基于角色的访问控制。 在RBAC中,用户被分配一个资源的角色,一个角色可以包含任意的操作。 然后请求检查用户是否有权限在资源上执行操作。
模型定义
让我们考虑一个简单的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
role_definition
是一个图关系构建器,它使用图来比较请求对象和策略对象。
策略模型
#策略定义
p, alice, data1, read p, bob, data2, write p, data2_admin, data2, read # 主体角色关系定义
# alice拥有data2_admin角色 g, alice, data2_admin
请求
alice, data2, read