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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。