创建一个完整的模型文件创建一个perm.conf文件,内容如下
# Request definition
[request_definition]
r = sub, obj, act
# Policy definition
[policy_definition]
p = sub, obj, act, eft # 这里我们定义了eft,不使用默认值
# Policy effect
[policy_effect]
e = some(where (p.eft == allow)) && !some(where (p.eft == deny)) # 这里使用了deny优先
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act #最简单的匹配规则。请求的参数与策略参数一致时获得策略结果
注意代码中的注释
创建一个policy.csv文件, 其中的每个字段的定义就如perm中[policy_definition]中定义的顺序:
p, zeta, data1, read, allow
p, bob, data2, write, allow
p, zeta, data2, write, deny
p, zeta, data2, write, allow
p 代表策略组名称,就是metchers里对应的那个p。后面的zeta,data, read, allow对应的就是策略定义中的sub,obj,act和策略结果eft。
假如,request参数在策略文件中能够匹配(zeta,data1和read),那么结果为allow;
假如,request参数在策略文件中能够匹配(zeta,data2,write),那么结果为deny,同时也匹配另一条策略结果为allow,根据policy_effect的定义,依然识别为假。
接下来用Go代码检验一下
创建main.go 代码如下:
package main
import (
“fmt”
“github.com/casbin/casbin”
)
func main() {
//通过策略文件和模型配置穿件一个casbin访问控制实例
e := casbin.NewEnforcer(“./perm.conf”, “./policy.csv”)
//定义各种sub,obj和act的数组
subs := []string{“bob”, “zeta”}
objs := []string{“data1”, “data2”}
acts := []string{“read”, “write”}
//遍历组合sub,obj,act并打印出对应策略匹配结果。
for _, sub := range subs {
for _, obj := range objs {
for _, act := range acts {
fmt.Println(sub, “/“, obj, “/“, act, “=“, e.Enforce(sub, obj, act))
}
}
}
}
这段Go代码很简单,组合每一种sub、obj和act,然后打印出访问控制的结果验证我们的策略文件和模型的设计。
运行结果为:
bob / data1 / read = false
bob / data1 / write = false
bob / data2 / read = false
bob / data2 / write = true
zeta / data1 / read = true
zeta / data1 / write = false
zeta / data2 / read = false
zeta / data2 / write = false
|