# 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`。