install
go get github.com/casbin/casbin/v2
配置model
权限控制主要的三要素:sub(用户),obj(资源),act(操作)
request_definition:定义请求的要素
policy_definition:定义策略的要素
role_definition:定义角色继承关系
matchers:权限匹配逻辑
policy_effect:可以对matchers匹配的结果进行再次验证
[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
配置policy
p代表权限,g代表管理员
alice 具备data1的read(g的subject和p的subject相同,实现了在原有的角色上添加额外的权限)和data2的read&write
xie 的权限和alice一样(角色还能继承)。由于角色的继承和分配的位置是同一个,所以你很难直接看出来这是继承角色,还是分配角色。所以一般在角色前面加上Role(如:Role::admin)
p, alice, data1, read
p, bob, data2, write
p, data2_admin, data2, read
p, data2_admin, data2, write
g, alice,data2_admin
g, xie,alice
权限验证
使用 NewEnforcer 加载 model 和 policy 得到执行者
执行者通过Enforce(sub,obj,act) 来判断是否可执行
package main
import (
"fmt"
"github.com/casbin/casbin/v2"
)
func main() {
enforcer, err := casbin.NewEnforcer("/Users/xieruixiang/go/src/good/model.conf", "/Users/xieruixiang/go/src/good/rbac_policy.csv")
if err != nil {
panic(err)
}
ok, err := enforcer.Enforce("alice", "data1", "read")
if err != nil {
panic(err)
}
fmt.Println(ok)
}