参考资料
[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, actp2 = sub, act
这些是咱们对policy
规定的具体形容
p, alice, data1, readp2, 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