1

参考资料
[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, act
p2 = sub, act

这些是我们对policy规则的具体描述

p, alice, data1, read
p2, 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)

image.png

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)

一曲长歌一剑天涯
3 声望3 粉丝