参考资料
[1] 例子
[2] model语法
[3] API

1. 简介

权限实际上就是管制谁能对什么资源进行什么操作。casbin将访问控制模型形象到一个基于 PERM(PolicyEffectRequestMatchers) 元模型的配置文件(模型文件)中。因而切换或更新受权机制只须要简略地批改配置文件。

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)。 然而, 你能够自定义你本人的申请表单, 如果不须要指定特定资源,则能够这样定义 subact ,或者如果有两个拜访实体, 则为 subsub2objact

Policy定义
[policy_definition] 局部是对vpolicy`的定义,以下文的 model 配置为例:

[policy_definition]p = sub, obj, actp2 = sub, act

这些是咱们对policy规定的具体形容

p, alice, data1, readp2, bob, write-all-objects

policy局部的每一行称之为一个策略规定, 每条策略规定通常以形如p, p2policy 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)