Casbin

官方文档Overview | Casbin 

编辑器Editor | 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

  

  1. request_definition是系统的查询模板。
     例如,一个请求alice, write, data1可以被解释为"主体Alice能否对对象'data1'执行'write'操作?"。

  2. policy_definition是系统的分配模板。
    例如,通过创建一个策略alice, write, data1,你就赋予了主体Alice在对象'data1'上执行'write'操作的权限。

  3. policy_effect定义了策略的效果。

  4. 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

  

posted @ 2024-04-11 09:46  羽鱼  阅读(133)  评论(0编辑  收藏  举报