关于golang:GOcasbin

16次阅读

共计 3221 个字符,预计需要花费 9 分钟才能阅读完成。

参考资料
[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)

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)
正文完
 0