API Overview
На этой странице представлен обзор основных API Casbin. Для установки и концепций см. Get started и How it works.
Enforce API
Примеры ниже используют модель RBAC в model.conf и политики в policy.csv. Синтаксис модели описан в Model syntax. Примеры файлов:
model.conf
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
policy.csv
p, admin, data1, read
p, admin, data1, write
p, admin, data2, read
p, admin, data2, write
p, alice, data1, read
p, bob, data2, write
g, amber, admin
g, abc, admin
Пример использования:
// Load information from files.
enforcer, err := casbin.NewEnforcer("./example/model.conf", "./example/policy.csv")
if err != nil {
log.Fatalf("Error, detail: %s", err)
}
ok, err := enforcer.Enforce("alice", "data1", "read")
NewEnforcer() загружает модель и политику из указанных путей (или из модели и адаптера). Он возвращает объект enforcer и ошибку. Адаптер файла по умолчанию используется, когда вы передаете два пути к файлам; вы можете заменить его на любой adapter.
enforcer.Enforce("alice", "data1", "read") проверяет, может ли Alice читать data1. Возвращает (true, nil) при разрешении и (false, nil) при отказе. С приведенной выше политикой этот вызов вернет true.
EnforceEx API
Чтобы увидеть, какая политика разрешила запрос, используйте EnforceEx():
ok, reason, err := enforcer.EnforceEx("amber", "data1", "read")
fmt.Println(ok, reason) // true [admin data1 read]
reason — это соответствующая политика (например, [admin data1 read]). Amber имеет роль admin, поэтому политика p, admin, data1, read разрешает запрос.
Связанные API:
-
ok, err := enforcer.EnforceWithMatcher(matcher, request)Enforce с одноразовым выражением matcher.
-
EnforceExWithMatcher(matcher, request)— АналогEnforceExс пользовательским матчером. -
BatchEnforce(requests)— Проверка множества запросов за один вызов; возвращает срез булевых значений.
Полный набор методов см. в Management API и RBAC API.
Management API
Get API
Эти методы возвращают данные политики. Пример:
enforcer, err := casbin.NewEnforcer("./example/model.conf", "./example/policy.csv")
if err != nil {
fmt.Printf("Error, details: %s\n", err)
}
allSubjects := enforcer.GetAllSubjects()
fmt.Println(allSubjects)
GetAllSubjects() возвращает все субъекты, присутствующие в политике (в данном случае: admin, alice, bob). Вывод:
[admin alice bob]
Используйте GetAllNamedSubjects("p") для конкретного типа политики. Тот же принцип применим к Objects, Actions и Roles.
Другие геттеры:
GetPolicy()/GetFilteredPolicy(0, "alice")— Все правила или отфильтрованные по полю.GetNamedPolicy("p")/GetFilteredNamedPolicy("p", 0, "bob")— То же самое для именованной политики.GetGroupingPolicy()/GetFilteredGroupingPolicy(0, "alice")— Правила назначения ролей.GetNamedGroupingPolicy("g")/GetFilteredNamedGroupingPolicy("g", 0, "alice")— То же самое для именованного группирования.
Add, delete, update API
Вы можете изменять политику во время выполнения. Пример: добавление, удаление, обновление и проверка:
// load information from files
enforcer, err := casbin.NewEnforcer("./example/model.conf", "./example/policy.csv")
if err != nil {
fmt.Printf("Error, details: %s\n", err)
}
// add a policy and use HasPolicy() to confirm
enforcer.AddPolicy("added_user", "data1", "read")
hasPolicy := enforcer.HasPolicy("added_user", "data1", "read")
fmt.Println(hasPolicy) // true, the policy was added successfully
// remove a policy and use HasPolicy() to confirm
enforcer.RemovePolicy("alice", "data1", "read")
hasPolicy = enforcer.HasPolicy("alice", "data1", "read")
fmt.Println(hasPolicy) // false, the policy was removed successfully
// update a policy and use HasPolicy() to confirm
enforcer.UpdatePolicy([]string{"added_user", "data1", "read"}, []string{"added_user", "data1", "write"})
hasPolicy = enforcer.HasPolicy("added_user", "data1", "read")
fmt.Println(hasPolicy) // false, the original policy has expired
hasPolicy = enforcer.HasPolicy("added_user", "data1", "write")
fmt.Println(hasPolicy) // true, the new policy is in effect
Та же схема add/remove/update/has существует для фильтрованных и именованных политик, а также для политик группирования. Для пакетных обновлений используйте множественные формы (например, AddPolicies, UpdatePolicies) со срезами в качестве аргументов.
Пример:
enforcer.UpdatePolicy([]string{"eve", "data3", "read"}, []string{"eve", "data3", "write"})
Измените Policy на Policies и скорректируйте параметры для пакетных операций:
enforcer.UpdatePolicies([][]string{{"eve", "data3", "read"}, {"jack", "data3", "read"}}, [][]string{{"eve", "data3", "write"}, {"jack", "data3", "write"}})
Пакетные операции также применимы к GroupingPolicy и NamedGroupingPolicy.
AddEx API
Методы AddEx добавляют правила пакетами, но пропускают уже существующие правила вместо того, чтобы вызывать ошибку:
AddPoliciesEx(rules [][]string) (bool, error)
AddNamedPoliciesEx(ptype string, rules [][]string) (bool, error)
AddGroupingPoliciesEx(rules [][]string) (bool, error)
AddNamedGroupingPoliciesEx(ptype string, rules [][]string) (bool, error)
SelfAddPoliciesEx(sec string, ptype string, rules [][]string) (bool, error)
При использовании AddPolicies, если одно правило уже существует, весь вызов завершается ошибкой, и никакие правила не добавляются. При использовании AddPoliciesEx существующие правила пропускаются, а остальные добавляются. Пример:
func TestDemo(t *testing.T) {
e, err := NewEnforcer("examples/basic_model.conf", "examples/basic_policy.csv")
if err != nil {
fmt.Printf("Error, details: %s\n", err)
}
e.ClearPolicy()
e.AddPolicy("user1", "data1", "read")
fmt.Println(e.GetPolicy())
testGetPolicy(t, e, [][]string{{"user1", "data1", "read"}})
// policy {"user1", "data1", "read"} now exists
// Use AddPolicies to add rules in batches
ok, _ := e.AddPolicies([][]string{{"user1", "data1", "read"}, {"user2", "data2", "read"}})
fmt.Println(e.GetPolicy())
// {"user2", "data2", "read"} failed to add because {"user1", "data1", "read"} already exists
// AddPolicies returns false and no other policies are checked, even though they may not exist in the existing ruleset
// ok == false
fmt.Println(ok)
testGetPolicy(t, e, [][]string{{"user1", "data1", "read"}})
// Use AddPoliciesEx to add rules in batches
ok, _ = e.AddPoliciesEx([][]string{{"user1", "data1", "read"}, {"user2", "data2", "read"}})
fmt.Println(e.GetPolicy())
// {"user2", "data2", "read"} is added successfully
// because AddPoliciesEx automatically filters the existing {"user1", "data1", "read"}
// ok == true
fmt.Println(ok)
testGetPolicy(t, e, [][]string{{"user1", "data1", "read"}, {"user2", "data2", "read"}})
}
RBAC API
Энфорсер также предоставляет вспомогательные функции RBAC (роли, пользователи, разрешения). Для настройки модели см. RBAC.
Загрузите модель и политику, как раньше:
enforcer, err := casbin.NewEnforcer("./example/model.conf", "./example/policy.csv")
if err != nil {
fmt.Printf("Error, details: %s\n", err)
}
Примеры вызовов RBAC:
roles, err := enforcer.GetRolesForUser("amber")
fmt.Println(roles) // [admin]
users, err := enforcer.GetUsersForRole("admin")
fmt.Println(users) // [amber abc]
GetRolesForUser("amber") возвращает [admin]. GetUsersForRole("admin") возвращает всех пользователей с этой ролью. HasRoleForUser("amber", "admin") возвращает true.
fmt.Println(enforcer.Enforce("bob", "data2", "write")) // true
enforcer.DeletePermission("data2", "write")
fmt.Println(enforcer.Enforce("bob", "data2", "write")) // false
DeletePermission("data2", "write") удаляет эт о разрешение у всех. DeletePermissionForUser("alice", "data1", "read") удаляет его только у Alice.
Полный список RBAC API см. в RBAC API.
Comments are powered by giscus and GitHub Discussions. They load from giscus.app and GitHub only after you click the button below.