# ABAC
## 什么是ABAC模式?
ABAC是`基于属性的访问控制`,可以使用主体、客体或动作的属性,而不是字符串本身来控制访问。 您之前可能就已经听过 XACML ,是一个复杂的 ABAC 访问控制语言。 与XACML相比,Casbin的ABAC非常简单: 在ABAC中,可以使用struct(或基于编程语言的类实例) 而不是字符串来表示模型元素。
例如,ABAC的官方实例如下:
~~~ini
[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
~~~
我们使用`r.obj.所有者`代替`r.obj`matcher。 在`Enforce()`函数中传递的`r.obj`函数是结构或类实例,而不是字符串。 Casbin将使用映像来检索`obj`结构或类中的成员变量。
这里是`r.obj`construction 或 class 的定义:
~~~go
type testResource struct {
Name string
Owner string
}
~~~
## 如何使用ABAC?
简单地说,要使用ABAC,您需要做两件事:
1. 在模型匹配器中指定属性。
2. 将元素的结构或类实例作为Casbin的`Enforce()`的参数传入。
Note:
1. 目前,仅请求元素,例如`r.such`、\[`r.obj`,\]`r.action`等等支持ABAC的元素。 您不能在策略元素上使用它,比如`p.sub`,因为在Casbin的策略中没有定义结构或者类。
2. 您可以在一个matcher中使用多个ABAC属性,例如:`m = r.sub.Domain == r.obj.Domain`。