共计 3221 个字符,预计需要花费 9 分钟才能阅读完成。
参考资料
[1] 例子
[2] model 语法
[3] API
1. 简介
权限实际上就是管制谁能对什么资源进行什么操作。casbin
将访问控制模型形象到一个基于 PERM(Policy
,Effect
,Request
,Matchers
)元模型的配置文件(模型文件)中。因而切换或更新受权机制只须要简略地批改配置文件。
policy
是策略或者说是规定的定义。它定义了具体的规定。request
是对拜访申请的形象,它与 e.Enforce()
函数的参数是一一对应的 matcher
匹配器会将申请与定义的每个 policy
一一匹配,生成多个匹配后果。effect
依据对申请使用匹配器得出的所有后果进行汇总,来决定该申请是容许还是回绝。
Request 定义 [request_definition]
局部用于 request 的定义,它明确了 e.Enforce(...)
函数中参数的含意。
[request_definition]
r = sub, obj, act
sub
, obj
, act
示意经典三元组: 拜访实体 (Subject
),拜访资源 (Object
) 和拜访办法 (Action
)。然而, 你能够自定义你本人的申请表单, 如果不须要指定特定资源,则能够这样定义 sub
、act
,或者如果有两个拜访实体, 则为 sub
、sub2
、obj
、act
。
Policy 定义[policy_definition]
局部是对 vpolicy` 的定义,以下文的 model 配置为例:
[policy_definition]
p = sub, obj, act
p2 = sub, act
这些是咱们对 policy
规定的具体形容
p, alice, data1, read
p2, bob, write-all-objects
policy
局部的每一行称之为一个策略规定,每条策略规定通常以形如 p
, p2
的policy type
结尾。如果存在多个 policy
定义,那么咱们会依据前文提到的 policy type
与具体的某条定义匹配。下面的 policy
的绑定关系将会在 matcher
中应用,列举如下:
(alice, data1, read) -> (p.sub, p.obj, p.act)
(bob, write-all-objects) -> (p2.sub, p2.act)
func TestCasbin(t *testing.T) {m := model.NewModel()
m.AddDef("r", "r", "sub, obj, act")
m.AddDef("p", "p", "sub, obj, act")
m.AddDef("g", "g", "_, _")
m.AddDef("e", "e", "some(where (p.eft == allow))")
m.AddDef("m", "m", "r.sub == g.sub && r.obj == p.obj && r.act == p.act")
a := fileadapter.NewAdapter("./policy.csv")
e, err := casbin.NewEnforcer(m, a)
if err != nil {t.Logf("NewEnforecer failed:%v\n", err)
}
check(e, "dajun", "data1", "read")
check(e, "lizi", "data2", "write")
check(e, "dajun", "data1", "write")
check(e, "dajun", "data2", "read")
users := e.GetAllSubjects() // 获取所有用户 / 获取以后策略中显示的主题列表
t.Log("users=", users)
allNamedSubjects := e.GetAllNamedSubjects("p") // 获取以后命名策略中显示的主题列表
t.Log("allNamedSubjects=", allNamedSubjects)
allObjects := e.GetAllObjects() // 获取以后命名策略中显示的对象列表。t.Log("allObjects=", allObjects)
allNamedObjects := e.GetAllNamedObjects("p") // 获取以后命名策略中显示的对象列表
t.Log("allNamedObjects=", allNamedObjects)
allActions := e.GetAllActions()
t.Log("allActions=", allActions)
allNamedActions := e.GetAllNamedActions("p")
t.Log("allNamedActions=", allNamedActions)
roles := e.GetAllRoles() // 获取所有角色
t.Log("roles=", roles)
allNamedRoles := e.GetAllNamedRoles("g")
t.Log("allNamedRoles=", allNamedRoles)
policy := e.GetPolicy() // 获取策略中的所有受权规定。t.Log("policy =", policy)
filteredPolicy := e.GetFilteredPolicy(0, "dajun") // 获取策略中的所有受权规定,能够指定字段筛选器
t.Log("filteredPolicy =", filteredPolicy)
namedPolicy := e.GetNamedPolicy("p") // 获取命名策略中的所有受权规定
t.Log("namedPolicy =", namedPolicy)
filteredNamedPolicy := e.GetFilteredNamedPolicy("p", 0, "bob") // 获取命名策略中的所有受权规定,能够指定字段过滤器
t.Log("filteredNamedPolicy =", filteredNamedPolicy)
hasPolicy := e.HasPolicy("data2_admin", "data2", "read") // 确定是否存在受权规定
t.Log("hasPolicy =", hasPolicy)
added, _ := e.AddPolicy("eve", "data3", "read") // 向以后策略增加受权规定。如果规定曾经存在,函数返回 false,并且不会增加规定。否则,函数通过增加新规定并返回 true
t.Log("added =", added)
rules := [][]string{[]string{"jack", "data4", "read"},
[]string{"katy", "data4", "write"},
[]string{"leyo", "data4", "read"},
[]string{"ham", "data4", "write"},
}
areRulesAdded, _ := e.AddPolicies(rules)
t.Log("areRulesAdded =", areRulesAdded)
added, _ = e.AddNamedPolicy("p", "eve", "data3", "read")
t.Log("added =", added)
getRolesForUser, _ := e.GetRolesForUser("dajun") // 获取用户具备的角色。t.Log("getRolesForUser =", getRolesForUser)
getUsersForRole, _ := e.GetUsersForRole("data1") // 获取具备角色的用户
t.Log("getUsersForRole =", getUsersForRole)
hasRoleForUser, _ := e.HasRoleForUser("alice", "data1_admin")
t.Log("hasRoleForUser =", hasRoleFor![image.png](/img/bVcSebF)