跳转到主要内容

管理 API

Management API 涵盖了所有 policy 和 grouping(role)操作:get、add、remove、update、filter。下文中的 e 表示一个 Enforcer 实例。

带过滤的 API(Filtered API)​

带过滤的方法接受 (fieldIndex int, fieldValues ...string) 参数:匹配从 fieldIndex 开始,fieldValues 是相邻位置上要求的值。在 fieldValues 中使用 "" 作为该位置的通配符。

例如:

p, alice, book, read
p, bob, book, read
p, bob, book, write
p, alice, pen, get
p, bob, pen ,get
e.GetFilteredPolicy(1, "book") // returns: [["alice", "book", "read"], ["bob", "book", "read"], ["bob", "book", "write"]]

e.GetFilteredPolicy(1, "book", "read") // returns: [["alice", "book", "read"], ["bob", "book", "read"]]

e.GetFilteredPolicy(0, "alice", "", "read") // returns: [[alice book read]]

e.GetFilteredPolicy(0, "alice") // returns: [["alice", "book", "read"], ["alice", "pen", "get"]]

API 参考​

e, err := NewEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv")

Enforce()​

Enforce 判断一个"subject"(主体)能否执行"action"(操作)来访问"object"(对象),输入参数通常为:(sub, obj, act)。

例如:

ok, err := e.Enforce(request)

EnforceWithMatcher()​

EnforceWithMatcher 使用自定义 matcher 来判断一个"subject"能否执行"action"来访问"object",输入参数通常为:(matcher, sub, obj, act),当 matcher 为 "" 时默认使用模型中的 matcher。

例如:

ok, err := e.EnforceWithMatcher(matcher, request)

EnforceEx()​

EnforceEx 通过返回匹配的规则来解释(explain)授权决策。

例如:

ok, reason, err := e.EnforceEx(request)

EnforceExWithMatcher()​

EnforceExWithMatcher 使用自定义 matcher,并通过返回匹配的规则来解释授权决策。

例如:

ok, reason, err := e.EnforceExWithMatcher(matcher, request)

BatchEnforce()​

BatchEnforce 逐个执行授权判断,并以 bool 数组返回结果。

例如:

boolArray, err := e.BatchEnforce(requests)

GetAllSubjects()​

GetAllSubjects 获取出现在当前 policy 中的 subject 列表。

例如:

allSubjects := e.GetAllSubjects()

GetAllNamedSubjects()​

GetAllNamedSubjects 获取出现在当前命名 policy 中的 subject 列表。

例如:

allNamedSubjects := e.GetAllNamedSubjects("p")

GetAllObjects()​

GetAllObjects 获取出现在当前 policy 中的 object 列表。

例如:

allObjects := e.GetAllObjects()

GetAllNamedObjects()​

GetAllNamedObjects 获取出现在当前命名 policy 中的 object 列表。

例如:

allNamedObjects := e.GetAllNamedObjects("p")

GetAllActions()​

GetAllActions 获取出现在当前 policy 中的 action 列表。

例如:

allActions := e.GetAllActions()

GetAllNamedActions()​

GetAllNamedActions 获取出现在当前命名 policy 中的 action 列表。

例如:

allNamedActions := e.GetAllNamedActions("p")

GetAllRoles()​

GetAllRoles 获取出现在当前 policy 中的 role 列表。

例如:

allRoles = e.GetAllRoles()

GetAllNamedRoles()​

GetAllNamedRoles 获取出现在当前命名 policy 中的 role 列表。

例如:

allNamedRoles := e.GetAllNamedRoles("g")

GetPolicy()​

GetPolicy 获取 policy 中的所有授权规则。

例如:

policy = e.GetPolicy()

GetFilteredPolicy()​

GetFilteredPolicy 获取 policy 中的所有授权规则,可指定字段过滤器。

例如:

filteredPolicy := e.GetFilteredPolicy(0, "alice")

GetNamedPolicy()​

GetNamedPolicy 获取命名 policy 中的所有授权规则。

例如:

namedPolicy := e.GetNamedPolicy("p")

GetFilteredNamedPolicy()​

GetFilteredNamedPolicy 获取命名 policy 中的所有授权规则,可指定字段过滤器。

例如:

filteredNamedPolicy = e.GetFilteredNamedPolicy("p", 0, "bob")

GetGroupingPolicy()​

GetGroupingPolicy 获取 policy 中的所有角色继承规则。

例如:

groupingPolicy := e.GetGroupingPolicy()

GetFilteredGroupingPolicy()​

GetFilteredGroupingPolicy 获取 policy 中的所有角色继承规则,可指定字段过滤器。

例如:

filteredGroupingPolicy := e.GetFilteredGroupingPolicy(0, "alice")

GetNamedGroupingPolicy()​

GetNamedGroupingPolicy 获取 policy 中的所有角色继承规则。

例如:

namedGroupingPolicy := e.GetNamedGroupingPolicy("g")

GetFilteredNamedGroupingPolicy()​

GetFilteredNamedGroupingPolicy 获取 policy 中的所有角色继承规则。

例如:

namedGroupingPolicy := e.GetFilteredNamedGroupingPolicy("g", 0, "alice")

HasPolicy()​

HasPolicy 判断某个授权规则是否存在。

例如:

hasPolicy := e.HasPolicy("data2_admin", "data2", "read")

HasNamedPolicy()​

HasNamedPolicy 判断某个命名授权规则是否存在。

例如:

hasNamedPolicy := e.HasNamedPolicy("p", "data2_admin", "data2", "read")

AddPolicy()​

AddPolicy 向当前 policy 添加一条授权规则。 如果该规则已存在,函数返回 false,且不会添加该规则。 否则函数返回 true,并添加新规则。

例如:

added := e.AddPolicy('eve', 'data3', 'read')

AddPolicies()​

AddPolicies 向当前 policy 添加多条授权规则。 该操作具有原子性。 因此,如果要添加的授权规则中包含与当前 policy 不一致的规则,函数将返回 false,且不会向当前 policy 添加任何规则。 如果所有授权规则都与 policy 规则一致,函数返回 true,并且每条规则都会被添加到当前 policy。

例如:

rules := [][] string {
[]string {"jack", "data4", "read"},
[]string {"katy", "data4", "write"},
[]string {"leyo", "data4", "read"},
[]string {"ham", "data4", "write"},
}

areRulesAdded := e.AddPolicies(rules)

AddPoliciesEx()​

AddPoliciesEx 向当前 policy 添加多条授权规则。 如果某条规则已存在,则不会添加该规则。 但与 AddPolicies 不同,其他不存在的规则仍会被添加,而不是直接返回 false。

例如:

ok, err := e.AddPoliciesEx([][]string{{"user1", "data1", "read"}, {"user2", "data2", "read"}})

AddNamedPolicy()​

AddNamedPolicy 向当前命名 policy 添加一条授权规则。 如果该规则已存在,函数返回 false,且不会添加该规则。 否则函数返回 true,并添加新规则。

例如:

added := e.AddNamedPolicy("p", "eve", "data3", "read")

AddNamedPolicies()​

AddNamedPolicies 向当前命名 policy 添加多条授权规则。 该操作具有原子性。 因此,如果要添加的授权规则中包含与当前 policy 不一致的规则,函数将返回 false,且不会向当前 policy 添加任何规则。 如果所有授权规则都与 policy 规则一致,函数返回 true,并且每条规则都会被添加到当前 policy。

例如:

rules := [][] string {
[]string {"jack", "data4", "read"},
[]string {"katy", "data4", "write"},
[]string {"leyo", "data4", "read"},
[]string {"ham", "data4", "write"},
}

areRulesAdded := e.AddNamedPolicies("p", rules)

AddNamedPoliciesEx()​

AddNamedPoliciesEx 向当前命名 policy 添加多条授权规则。 如果某条规则已存在,则不会添加该规则。 但与 AddNamedPolicies 不同,其他不存在的规则仍会被添加,而不是直接返回 false。

例如:

ok, err := e.AddNamedPoliciesEx("p", [][]string{{"user1", "data1", "read"}, {"user2", "data2", "read"}})

SelfAddPoliciesEx()​

SelfAddPoliciesEx 向当前命名 policy 添加多条授权规则,并禁用 autoNotifyWatcher。 如果某条规则已存在,则不会添加该规则。 但与 SelfAddPolicies 不同,其他不存在的规则仍会被添加,而不是直接返回 false。

例如:

ok, err := e.SelfAddPoliciesEx("p", "p", [][]string{{"user1", "data1", "read"}, {"user2", "data2", "read"}})

RemovePolicy()​

RemovePolicy 从当前 policy 中移除一条授权规则。

例如:

removed := e.RemovePolicy("alice", "data1", "read")

RemovePolicies()​

RemovePolicies 从当前 policy 中移除多条授权规则。 该操作具有原子性。 因此,如果要移除的授权规则中包含与当前 policy 不一致的规则,函数将返回 false,且不会从当前 policy 中移除任何规则。 如果所有授权规则都与 policy 规则一致,函数返回 true,并且每条规则都会从当前 policy 中移除。

例如:

rules := [][] string {
[]string {"jack", "data4", "read"},
[]string {"katy", "data4", "write"},
[]string {"leyo", "data4", "read"},
[]string {"ham", "data4", "write"},
}

areRulesRemoved := e.RemovePolicies(rules)

RemoveFilteredPolicy()​

RemoveFilteredPolicy 从当前 policy 中移除一条授权规则,可指定字段过滤器。 RemovePolicy 从当前 policy 中移除一条授权规则。

例如:

removed := e.RemoveFilteredPolicy(0, "alice", "data1", "read")

RemoveNamedPolicy()​

RemoveNamedPolicy 从当前命名 policy 中移除一条授权规则。

例如:

removed := e.RemoveNamedPolicy("p", "alice", "data1", "read")

RemoveNamedPolicies()​

RemoveNamedPolicies 从当前命名 policy 中移除多条授权规则。 该操作具有原子性。 因此,如果要移除的授权规则中包含与当前 policy 不一致的规则,函数将返回 false,且不会从当前 policy 中移除任何规则。 如果所有授权规则都与 policy 规则一致,函数返回 true,并且每条规则都会从当前 policy 中移除。

例如:

rules := [][] string {
[]string {"jack", "data4", "read"},
[]string {"katy", "data4", "write"},
[]string {"leyo", "data4", "read"},
[]string {"ham", "data4", "write"},
}

areRulesRemoved := e.RemoveNamedPolicies("p", rules)

RemoveFilteredNamedPolicy()​

RemoveFilteredNamedPolicy 从当前命名 policy 中移除一条授权规则,可指定字段过滤器。

例如:

removed := e.RemoveFilteredNamedPolicy("p", 0, "alice", "data1", "read")

HasGroupingPolicy()​

HasGroupingPolicy 判断某个角色继承规则是否存在。

例如:

has := e.HasGroupingPolicy("alice", "data2_admin")

HasNamedGroupingPolicy()​

HasNamedGroupingPolicy 判断某个命名角色继承规则是否存在。

例如:

has := e.HasNamedGroupingPolicy("g", "alice", "data2_admin")

AddGroupingPolicy()​

AddGroupingPolicy 向当前 policy 添加一条角色继承规则。 如果该规则已存在,函数返回 false,且不会添加该规则。 否则函数返回 true,并添加新规则。

例如:

added := e.AddGroupingPolicy("group1", "data2_admin")

AddGroupingPolicies()​

AddGroupingPolicies 向当前 policy 添加多条角色继承规则。 该操作具有原子性。 因此,如果要添加的授权规则中包含与当前 policy 不一致的规则,函数将返回 false,且不会向当前 policy 添加任何规则。 如果所有授权规则都与 policy 规则一致,函数返回 true,并且每条规则都会被添加到当前 policy。

例如:

rules := [][] string {
[]string {"ham", "data4_admin"},
[]string {"jack", "data5_admin"},
}

areRulesAdded := e.AddGroupingPolicies(rules)

AddGroupingPoliciesEx()​

AddGroupingPoliciesEx 向当前 policy 添加多条角色继承规则。 如果某条规则已存在,则不会添加该规则。 但与 AddGroupingPolicies 不同,其他不存在的规则仍会被添加,而不是直接返回 false。

例如:

ok, err := e.AddGroupingPoliciesEx([][]string{{"user1", "member"}, {"user2", "member"}})

AddNamedGroupingPolicy()​

AddNamedGroupingPolicy 向当前 policy 添加一条命名角色继承规则。 如果该规则已存在,函数返回 false,且不会添加该规则。 否则函数返回 true,并添加新规则。

例如:

added := e.AddNamedGroupingPolicy("g", "group1", "data2_admin")

AddNamedGroupingPolicies()​

AddNamedGroupingPolicies 向当前 policy 添加多条命名角色继承规则。 该操作具有原子性。 因此,如果要添加的授权规则中包含与当前 policy 不一致的规则,函数将返回 false,且不会向当前 policy 添加任何规则。 如果所有授权规则都与 policy 规则一致,函数返回 true,并且每条规则都会被添加到当前 policy。

例如:

rules := [][] string {
[]string {"ham", "data4_admin"},
[]string {"jack", "data5_admin"},
}

areRulesAdded := e.AddNamedGroupingPolicies("g", rules)

AddNamedGroupingPoliciesEx()​

AddNamedGroupingPoliciesEx 向当前 policy 添加多条命名角色继承规则。 如果某条规则已存在,则不会添加该规则。 但与 AddNamedGroupingPolicies 不同,其他不存在的规则仍会被添加,而不是直接返回 false。

例如:

ok, err := e.AddNamedGroupingPoliciesEx("g", [][]string{{"user1", "member"}, {"user2", "member"}})

RemoveGroupingPolicy()​

RemoveGroupingPolicy 从当前 policy 中移除一条角色继承规则。

例如:

removed := e.RemoveGroupingPolicy("alice", "data2_admin")

RemoveGroupingPolicies()​

RemoveGroupingPolicies 从当前 policy 中移除多条角色继承规则。 该操作具有原子性。 因此,如果要移除的授权规则中包含与当前 policy 不一致的规则,函数将返回 false,且不会从当前 policy 中移除任何规则。 如果所有授权规则都与 policy 规则一致,函数返回 true,并且每条规则都会从当前 policy 中移除。

例如:

rules := [][] string {
[]string {"ham", "data4_admin"},
[]string {"jack", "data5_admin"},
}

areRulesRemoved := e.RemoveGroupingPolicies(rules)

RemoveFilteredGroupingPolicy()​

RemoveFilteredGroupingPolicy 从当前 policy 中移除一条角色继承规则,可指定字段过滤器。

例如:

removed := e.RemoveFilteredGroupingPolicy(0, "alice")

RemoveNamedGroupingPolicy()​

RemoveNamedGroupingPolicy 从当前命名 policy 中移除一条角色继承规则。

例如:

removed := e.RemoveNamedGroupingPolicy("g", "alice")

RemoveNamedGroupingPolicies()​

RemoveNamedGroupingPolicies 从当前 policy 中移除多条命名角色继承规则。 该操作具有原子性。 因此,如果要移除的授权规则中包含与当前 policy 不一致的规则,函数将返回 false,且不会从当前 policy 中移除任何规则。 如果所有授权规则都与 policy 规则一致,函数返回 true,并且每条规则都会从当前 policy 中移除。

例如:

rules := [][] string {
[]string {"ham", "data4_admin"},
[]string {"jack", "data5_admin"},
}

areRulesRemoved := e.RemoveNamedGroupingPolicies("g", rules)

RemoveFilteredNamedGroupingPolicy()​

RemoveFilteredNamedGroupingPolicy 从当前命名 policy 中移除一条角色继承规则,可指定字段过滤器。

例如:

removed := e.RemoveFilteredNamedGroupingPolicy("g", 0, "alice")

UpdatePolicy()​

UpdatePolicy 将一条旧 policy 更新为新 policy。

例如:

updated, err := e.UpdatePolicy([]string{"eve", "data3", "read"}, []string{"eve", "data3", "write"})

UpdatePolicies()​

UpdatePolicies 将所有旧 policy 更新为新 policy。

例如:

updated, err := e.UpdatePolicies([][]string{{"eve", "data3", "read"}, {"jack", "data3", "read"}}, [][]string{{"eve", "data3", "write"}, {"jack", "data3", "write"}})

UpdateNamedPolicy()​

UpdateNamedPolicy 将命名 policy 中的一条旧 policy 更新为新 policy。

例如:

updated, err := e.UpdateNamedPolicy("p", []string{"eve", "data3", "read"}, []string{"eve", "data3", "write"})

UpdateNamedPolicies()​

UpdateNamedPolicies 将命名 policy 中的所有旧 policy 更新为新 policy。

例如:

updated, err := e.UpdateNamedPolicies("p", [][]string{{"eve", "data3", "read"}, {"jack", "data3", "read"}}, [][]string{{"eve", "data3", "write"}, {"jack", "data3", "write"}})

UpdateFilteredPolicies()​

UpdateFilteredPolicies 将所有匹配过滤条件的旧 policy 更新为新 policy。

例如:

updated, err := e.UpdateFilteredPolicies([][]string{{"eve", "data3", "write"}}, 0, "eve", "data3", "read")

AddFunction()​

AddFunction 添加一个自定义函数。

例如:

func CustomFunction(key1 string, key2 string) bool {
if key1 == "/alice_data2/myid/using/res_id" && key2 == "/alice_data/:resource" {
return true
} else if key1 == "/alice_data2/myid/using/res_id" && key2 == "/alice_data2/:id/using/:resId" {
return true
} else {
return false
}
}

func CustomFunctionWrapper(args ...interface{}) (interface{}, error) {
key1 := args[0].(string)
key2 := args[1].(string)

return bool(CustomFunction(key1, key2)), nil
}

e.AddFunction("keyMatchCustom", CustomFunctionWrapper)

LoadFilteredPolicy()​

LoadFilteredPolicy 从文件/数据库中加载经过过滤的 policy。

例如:

err := e.LoadFilteredPolicy()

LoadIncrementalFilteredPolicy()​

LoadIncrementalFilteredPolicy 从文件/数据库中追加一条经过过滤的 policy。

例如:

err := e.LoadIncrementalFilteredPolicy()

UpdateGroupingPolicy()​

UpdateGroupingPolicy 将 g 部分中的 oldRule 更新为 newRule。

例如:

succeed, err : = e.UpdateGroupingPolicy([]string{"data3_admin", "data4_admin"}, []string{"admin", "data4_admin"})

UpdateNamedGroupingPolicy()​

UpdateNamedGroupingPolicy 将 g 部分中名为 ptype 的 oldRule 更新为 newRule。

例如:

succeed, err : = e.UpdateGroupingPolicy("g1",[]string{"data3_admin", "data4_admin"}, []string{"admin", "data4_admin"})

SetFieldIndex()​

SetFieldIndex 支持自定义 sub、obj、domain 和 priority 的常规名称和位置。

[policy_definition]
p = customized_priority, obj, act, eft, subject

例如:

e.SetFieldIndex("p", constant.PriorityIndex, 0)
e.SetFieldIndex("p", constant.SubjectIndex, 4)