Перейти к основному содержимому

Что такое PBAC? Управление доступом на основе политик в Casbin

Что такое PBAC?​

Управление доступом на основе политик (PBAC) хранит правила авторизации как данные политики, отделенные от кода приложения, и вычисляет их во время выполнения. Изменение того, кто может что делать, означает редактирование политики, а не выпуск новой версии приложения, поэтому PBAC часто выбирается, когда за правила отвечают команды безопасности или соответствия требованиям.

В Casbin PBAC означает хранение выражений правил в строках политики и их вычисление с помощью eval(). В отличие от фиксированных проверок ролей или атрибутов в модели, каждая строка политики может содержать собственное условие.

Политики могут включать:

  • Динамические выражения: вычисляются для каждого запроса (например, r.sub.Age >= 18)
  • Сложная логика: булевы и сравнительные операторы, доступ к атрибутам
  • Контекст: атрибуты пользователя, ресурса и окружения
  • Бизнес-правила: доменно-специфичная логика в политике

PBAC против ABAC и RBAC​

RBAC и ABAC описывают на чем основывается решение: на ролях или атрибутах. PBAC описывает как управляются правила: как политика, вычисляемая во время выполнения. Эти понятия пересекаются. Примеры на этой странице — это условия ABAC, управляемые как PBAC, а политика RBAC в Casbin также является данными, которые могут меняться во время выполнения. На практике термин "PBAC" используется для систем, где сама логика правил, а не только назначения, находится в политике. Выбор модели управления доступом сравнивает модели на одном примере.

Модель​

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub_rule, obj_rule, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = eval(p.sub_rule) && eval(p.obj_rule) && r.act == p.act
  • p.sub_rule / p.obj_rule — выражения над запросом (например, r.sub.Age >= 18, r.obj.Level >= 1)
  • eval() — вычисляет эти выражения во время enforce

Примеры​

Базовая политика​

Политика:

p, r.sub.Age >= 18, r.obj.Level >= 1, play

Примеры запросов:

{"Age":25}, {"Level":2}, play # ALLOWED (Age >= 18 and Level >= 1)
{"Age":16}, {"Level":2}, play # DENIED (Age < 18)
{"Age":20}, {"Level":0}, play # DENIED (Level < 1)
{"Age":25}, {"Level":2}, read # DENIED (action doesn't match policy)

Сложная политика​

Политика:

p, r.sub.Department == "IT" && r.sub.Level >= 3, r.obj.Confidential == false, read

Примеры запросов:

{"Department":"IT","Level":3}, {"Confidential":false}, read # ALLOWED
{"Department":"IT","Level":2}, {"Confidential":false}, read # DENIED (Level < 3)
{"Department":"HR","Level":3}, {"Confidential":false}, read # DENIED (Department != "IT")
{"Department":"IT","Level":3}, {"Confidential":true}, read # DENIED (Confidential == true)

Пример кода:

e, _ := NewEnforcer("examples/pbac_model.conf", "examples/pbac_policy.csv")

// Enable JSON request support
e.EnableAcceptJsonRequest(true)

// Define subject and object with attributes
subject := `{"Department": "IT", "Level": 3}`
object := `{"Confidential": false}`
action := "read"

// Check permission
ok, err := e.Enforce(subject, object, action)
if err != nil {
fmt.Printf("Enforcement error: %v\n", err)
return
}
if ok {
fmt.Println("Permission granted")
} else {
fmt.Println("Permission denied")
}

При использовании EnableAcceptJsonRequest(true) параметры, похожие на JSON ({ или [), анализируются автоматически; некорректный JSON возвращает понятную ошибку.

Comments are powered by giscus and GitHub Discussions. They load from giscus.app and GitHub only after you click the button below.