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

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.