Как это работает
В Casbin контроль доступа выражается в виде файлов CONF на основе мета-модели PERM (Policy, Effect, Request, Matchers). Изменение логики авторизации в вашем проекте сводится к редактированию файла конфигурации. Вы можете создавать пользовательские модели, комбинируя компоненты — например, роли RBAC с атрибутами ABAC в едином наборе модели и политик.
Модель PERM состоит из четырёх частей: Request, Policy, Effect и Matchers. Вместе они определяют взаимодействие пользователей и ресурсов.
Request
Определение запроса specifies параметры запроса на доступ. Базовый запрос представляет собой кортеж из трех элементов: subject (кто запрашивает), object (ресурс) и action (операция).
Пример:
r = sub, obj, act
Это задает имена параметров и их порядок для логики сопоставления.
Policy
Определение политики описывает структуру ваших правил доступа: имена полей и их порядок.
Примеры:
p = sub, obj, act или p = sub, obj, act, eft
Когда eft (эффект политики) опущен в определении, поле эффекта в файле политики игнорируется, а совпавшие политики рассматриваются как "allow".
Matcher
Мэтчер определяет, как запрос сопоставляется с политиками.
Пример: m = r.sub == p.sub && r.act == p.act && r.obj == p.obj
Когда subject, object и action запроса совпадают с полями политики, используется эффект этой политики (p.eft). Эффект хранится в p.eft.
Effect
Секция effect объединяет эффекты всех совпавших политик с помощью логического выражения.
Пример: e = some(where (p.eft == allow))
Если любая совпавшая политика имеет эффект "allow", результатом является allow.
Другой пример:
e = some(where (p.eft == allow)) && !some(where (p.eft == deny))
Это означает: результат будет allow только если хотя бы одна политика разрешает и ни одна не запрещает. Если совпадают и allow, и deny, побеждает deny.
ACL — это самая простая модель в Casbin. Вот минимальная модель ACL:
# Request definition
[request_definition]
r = sub, obj, act
# Policy definition
[policy_definition]
p = sub, obj, act
# Policy effect
[policy_effect]
e = some(where (p.eft == allow))
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
Пример политики для этой модели:
p, alice, data1, read
p, bob, data2, write
Таким образом:
- alice может читать data1
- bob может писать data2
Вы можете разбить мэтчеры на несколько строк, завершая каждую строку символом \:
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj \
&& r.act == p.act
Оператор in доступен в реализации на Go (пока недоступен в jCasbin или Node-Casbin):
# Matchers
[matchers]
m = r.obj == p.obj && r.act == p.act || r.obj in ('data2', 'data3')
Массив должен содержать более одного элемента; в противном случае реализация на Go может вызвать панику.
Для получения информации о других операторах см. govaluate.
Comments are powered by giscus and GitHub Discussions. They load from giscus.app and GitHub only after you click the button below.