ABAC权限控制学习

ABAC模型

什么是ABAC模式?

ABAC是基于属性的访问控制,可以使用主体、客体或动作的属性,而不是字符串本身来控制访问。 您之前可能就已经听过 XACML ,是一个复杂的 ABAC 访问控制语言。 与XACML相比,Casbin的ABAC非常简单:在ABAC中,可以使用struct(或基于编程语言的类实例) 而不是字符串来表示模型元素。

例如,ABAC的官方实例如下:

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

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

[matchers]
m = r.sub == r.obj.Owner

我们在 matcher 中使用 r.obj.Owner 代替 r.obj。 在 Enforce() 函数中传递的 r.obj 函数是结构或类实例,而不是字符串。 Casbin将使用映像来检索 obj结构或类中的成员变量。

这里是 r.obj construction 或 class 的定义:

type testResource struct {
    Name  string
    Owner string
}

Casbin模型

Casbin:https://casbin.org/zh-CN/

定义一个Policy策略,定义一个Matchers匹配规则,通过Request请求参数与Policy策略通过规则进行匹配,获得一个Effect影响,拿到Effect影响的结果,进入Effect影响的表达式,返回一个布尔值

Policy 策略

p={sub, obj, act, eft}

策略(实体,资源,方法,影响)

属性 属性名称 描述
sub subject 访问实体
obj object 访问的资源
act action 访问的方式,POST、GET
eft effect 策略结果,一般为空,只有两种结果(allow(默认)、deny)
[policy_definition]
p = sub, obj, act, eft
Effect 影响

它决定我们是否可以放行,仅以下几种:

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
subjectPriority(p.eft) 基于角色的优先级 主题优先级
  • e = some(where(p.eft == allow)) 这种情况下 我们的一个matchers匹配完成,得到了allow 那么这条请求将被放行
  • e = some(where(p.eft == allow)) && !some(where(p.eft == deny))
[policy_effect]
e = some(where (p.eft == allow))

解释:看看经过匹配规则后的返回值是否等于allow

Request 请求
[request_definition]
r = sub, obj, act

解释:请求入参(实体,资源,方法)

Matchers 匹配规则

Request 和 Policy 的匹配规则

[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

解释:进来的实体、资源、方法 能不能在权限表里面找到一致的

r 请求 p 策略

这时候会把 r 和 p 按照上述描述进行匹配,从而返回匹配结果(eft),如果不定义,会返回allow,如果定义过了,会返回我们定义过的那个结果

模型示例:

[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

转载自:https://casbin.org/docs/zh-CN/abac

上一篇:python刷题


下一篇:基础拓扑学讲义 1.4 (聚点和闭包)