How It Works
В Casbin модель контроля доступа абстрагирована в CONF файл на основе PERM метамодели (Policy, Effect, Request, Matchers). Переключение или обновление механизма авторизации для проекта так же просто, как изменение конфигурации. Вы можете настроить свою собственную модель контроля доступа, комбинируя доступные модели. Например, вы можете объединить роли RBAC и атрибуты ABAC в одной модели и использовать один набор правил политики.
Модель PERM состоит из четырех основ: Policy, Effect, Request и Matchers. Эти основы описывают отношение между ресурсами и пользователями.
Request
Определяет параметры запроса. Базовый запрос - это объект кортежа, требующий как минимум субъекта (доступная сущность), объекта (доступный ресурс) и действия (метод доступа).
Например, определение запроса может выглядеть так: r={sub,obj,act}
Это определение указывает имена параметров и порядок, требуемый функцией сопоставления контроля доступа.
Policy
Определяет модель для стратегии доступа. Он указывает имя и порядок полей в документе правила Policy.
Например: p={sub, obj, act}
или p={sub, obj, act, eft}
Примечание: Если eft (результат политики) не определен, поле результата в файле политики не будет прочитано, и результат сопоставления политики будет разрешен по умолчанию.
Matcher
Определяет правила сопоставления для Request и Policy.
Например: m = r.sub == p.sub && r.act == p.act && r.obj == p.obj
Это простое и распространенное правило сопоставления означает, что если запрошенные параметры (сущности, ресурсы и методы) равны тем, которые найдены в политике, то возвращается результат политики (p.eft
). Результат стратегии будет сохранен в p.eft
.
Effect
Выполняет логическое комбинированное суждение о результатах сопоставления Matchers.
Например: e = some(where(p.eft == allow))
Это утверждение означает, что если результат сопоставления стратегии p.eft
имеет результат (некоторые) разрешения, то окончательный результат является истинным.
Давайте посмотрим на другой пример:
e = some(where (p.eft == allow)) && !some(where (p.eft == deny))
Логический смысл этого примера комбинации: если есть стратегия, которая соответствует результату разрешения, и нет стратегии, которая соответствует результату отказа, результат является истинным. Другими словами, это истина, когда все сопоставленные стратегии разрешены. Если есть какой-либо отказ, оба являются ложью (более просто, когда разрешение и отказ существуют одновременно, отказ имеет приоритет).
Самая базовая и простая модель в Casbin - это ACL. Модель CONF для 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
Пример политики для модели ACL:
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
Кроме того, если вы используете ABAC, вы можете попробовать оператор 'in', как показано в следующем примере для Casbin golang edition (jCasbin и Node-Casbin пока не поддерживаются):
# Matchers
[matchers]
m = r.obj == p.obj && r.act == p.act || r.obj in ('data2', 'data3')
Но вы ОБЯЗАНЫ убедиться, что длина массива БОЛЬШЕ, чем 1, иначе это вызовет панику.
Для большего количества операторов вы можете взглянуть на govaluate.