Casbin

Casbin

  • Документ
  • API
  • Редактор
  • Плагины IDE
  • Single Sign-On (SSO)
  • Форум
  • Справка
  • Блог
  • Pricing
  • Contact Sales
  • Languages iconРусский
    • English
    • 中文
    • 한국어
    • Français
    • Deutsch
    • 日本語
    • Помочь перевести
  • GitHub

›Модель

Основы

  • Общий обзор
  • Начать работу
  • Как это работает
  • Уроки

Модель

  • Поддерживаемые модели
  • Синтаксис для моделей
  • Эффект
  • Функция
  • RBAC
  • RBAC with Pattern
  • RBAC с доменами
  • Casbin RBAC v.s. RBAC96
  • АДАТ
  • Приоритетная модель
  • Супер админ

Хранилище

  • Модель хранилища
  • Хранилище политики
  • Загрузка подмножества политик

Расширения

  • Enforcers
  • Адаптеры
  • Наблюдатели
  • Диспетчеры
  • Менеджеры ролей
  • Посредники
  • GraphQL Middlewares
  • Облачные Посредники

API

  • Обзор API
  • API управления
  • RBAC API
  • RBAC с доменным API
  • RoleManager API
  • Права доступа к данным

Расширенное использование

  • Многопоточность
  • Benchmarks
  • Оптимизация производительности
  • Авторизация Кубернетов
  • Авторизация служебной ячейки через посланника

Управление

  • Администратор портала
  • Служба Касбина
  • Обработка журнала и ошибок
  • Использование интерфейса

Редактор

  • Онлайн-редактор
  • Плагины IDE

Ещё

  • Наши усыновители
  • Вклад
  • Политика конфиденциальности
  • Условия предоставления услуг
Translate

Синтаксис для моделей

  • Модель CONF должна иметь по крайней мере четыре раздела: [request_definition], [policy_definition], [policy_effect], [matchers].

  • Если модель использует RBAC, следует добавить раздел [role_definition].

  • Модель CONF может содержать комментарии. Комментарии начинаются с #, и # прокомментирует остальную строку.

Определение запроса

[request_definition] - это определение запроса доступа. Оно определяет аргументы в e.Enforce(...) функции.

[request_definition]
r = sub, obj, акт

sub, obj, act представляет классический тройник: доступ к сущности (Subject), доступным ресурсу (Object) и методу доступа (Action). Однако вы можете настроить свою собственную форму запроса, например sub, действовать , если вам не нужно указывать конкретный ресурс, или sub, sub2, obj, поступать если у вас есть два доступных объекта.

Определение политики

[policy_definition] это определение политики. Оно определяет значение политики. Например, у нас есть следующая модель:

[policy_definition]
p = sub, obj, акт
p2 = sub, акт

И у нас есть следующая политика (если в файле политики)

p, alice, data1, чтение
p2, bob, write-all-objects

Каждая строка в политике называется правилом политики. Каждое правило политики начинается с типа ``, например p, p2. Он используется для соответствия политическому определению при наличии нескольких определений. Вышеуказанная политика свидетельствует о нижеследующих обязательствах. Привязка может быть использована в матче.

(alice, data1, read) -> (p.sub, p.obj, p.act)
(bob, write-all-objects) -> (p2.sub, p2.act)

::tip Элементы правила политики всегда рассматриваются какстрока. Если у вас есть какие-либо вопросы по этому вопросу, пожалуйста, смотрите обсуждение по адресу https://github.com/casbin/casbin/issues/113 :::

Стратегический эффект

[policy_effect] это определение для политического эффекта. Она определяет, должен ли запрос на доступ быть одобрен, если несколько правил политики соответствуют запросу. Например, одно правило разрешает и другое отрицает.

[policy_effect]
e = где-то (где (p.eft == допустить))

Вышеприведенный политический эффект означает, если существует какое-либо соответствующее правило политики позволяющее, окончательный эффект разрешить (aka allow-override). p.eft является эффектом для политики, он может быть разрешить или отрицать. Это необязательно, и значение по умолчанию разрешить. Так как мы не указали выше, он использует значение по умолчанию.

Другим примером политического эффекта является:

[policy_effect]
e = !some(где (p.eft == отрицать))

Это означает, что если не соответствует правиламотрицать, окончательный эффект позволяет (aka deny-override). некоторые означают: если существует одно соответствующее правило политики. любые означают: все соответствующие правила политики (не используются здесь). Эффект политики может быть даже связан с логическими выражениями:

[policy_effect]
e = где-то (где (p.eft == разрешить)) && !где(где (p.eft == отрицать))

Это означает, что по крайней мере одно соответствующее правилоразрешает, и не существует соответствующее правило политикиотрицает. Так что таким образом поддерживаются как разрешение, так и отказ в разрешениях, и отказ от разрешений.

::note Хотя мы разработали синтаксис эффекта политики, как и выше, Нынешние реализации используют только жесткий программный эффект, поскольку мы обнаружили, что такой гибкости не надо. Так что на данный момент вы должны использовать один из встроенных эффектов политики, а не настраивать свой собственный эффект. :::

К числу поддерживаемых встроенных политических последствий относятся:

Стратегический эффектЗначениеПример
где-то (где (p.eft == допустить))переопределитьACL, RBAC, и т.д.
!some(where (p.eft == deny))запретитьЗапретить переопределение
где-то (где (p.eft == allow)) && !some(где (p.eft == deny))разрешить и запретитьЗамедлить и запретить
приоритет (p.eft) || отрицаниеприоритетПриоритет
subjectPriority(p.eft)приоритет на основе ролиПредмет - Приоритет

Матчеры

[matchers] - это определение для вычисления политики. Соответствующие устройства являются выражениями. Оно определяет как правила политики вычисляются против запроса.

[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

Вышеупомянутый матч прост, это означает, что тема, объект и действие в запросе должны соответствовать правилам политики.

Вы можете использовать арифметические +, -, *, / и логические операторы, такие как &&, |, ! в вычислениях.

Несколько разделов типа

Если вам нужны несколько определений политики или несколько матчей, вы можете использовать такие определения, как p2, m2. Фактически, все из вышеперечисленных четырех разделов могут использовать несколько типов, а синтаксис r+number, такие как r2, e2. По умолчанию эти четыре секции должны соответствовать одному из них. Например, ваш r2 будет использовать только матч m2 для соответствия политикам p2.

Вы можете передать в EnforceContext в качестве первого параметра принудительного применения метода для указания типов, EnforceContext это как

go
Node.js
Java
EnforceContext{"r2","p2","e2","m2"}
type EnforceContext struct {
RType string
PType string
EType string
MType string
}
const enforceContext = new EnforceContext('r2', 'p2', 'e2', 'm2');
class EnforceContext {
constructor(rType, pType, eType, mType) {
this.pType = pType;
this.eType = eType;
this.mType = mType;
this.rType = rType;
}
}
EnforceContext enforceContext = новый контекст принудительного обеспечения ("2");
публичный класс EnforceContext {
private String pType;
private String eType;
приватная строка mType;
частная строка rType;
public EnforceContext(String suffix) {
this. Тип = "p" + суффикс;
this.eType = "e" + суффикс;
это. Тип = "m" + суффикс;
this.rType = "r" + суффикс;
}
}

Пример использования, см. модель и политика, запрос приводится следующим образом

go
Node.js
Java
// Передача в суффикс параметра NewEnforceContext,such as 2 or 3 и создаёт r2,p2,p2,etc..
enforceContext := NewEnforceContext("2")
// You can also specify a certain type individually
enforceContext.EType = "e"
// Don't pass in EnforceContext,the default is r,p,e,m
e.Enforce("alice", "data2", "read") // true
// pass in EnforceContext
e.Enforce(enforceContext, struct{ Age int }{Age: 70}, "/data1", "read") //false
e.Enforce(enforceContext, struct{ Age int }{Age: 30}, "/data1", "read") //true
// Передача в суффикс параметра NewEnforceContext,such as 2 or 3 и создаёт r2,p2,p2,etc..
const enforceContext = new NewEnforceContext('2');
// You can also specify a certain type individually
enforceContext.eType = "e"
// Don't pass in EnforceContext,the default is r,p,e,m
e.Enforce("alice", "data2", "read") // true
// pass in EnforceContext
e.Enforce(enforceContext, {Age: 70}, "/data1", "read") //false
e.Enforce(enforceContext, {Age: 30}, "/data1", "read") //true
// Pass in a suffix as parameter to NewEnforceContext,such as 2 or 3 and it will create r2, p2, etc..
EnforceContext enforceContext = new EnforceContext("2");
// Вы также можете указать определенный тип
принудительного контекста. eteType("e");
// Don't pass in EnforceContext, the default is r, p, e, m
e. nforce("alice", "data2", "read"); // true
// Pass in EnforceContext
// TestEvalRule находится в https://github. om/casbin/jcasbin/blob/master/src/test/java/org/casbin/jcasbin/main/AbacAPIUnitTest.java#L56
e.enforce(enforceContext, new AbacAPIUnitTest.TestEvalRule("alice", 70), "/data1", "read"); // false
e.enforce(enforceContext, new AbacAPIUnitTest.TestEvalRule("alice", 30), "/data1", "read"); // true // true // true

Special Grammer

Вы также можете использовать в, единственный оператор с текстовым именем. Этот оператор проверяет правый массив на наличие значения, равного значению левой стороны. Равенство определяется использованием == оператора, и эта библиотека не проверяет типы между значениями. Любые два значения при передаче на интерфейс{}, и все равно могут быть проверены на равенство с == будет действовать как ожидалось. Обратите внимание, что вы можете использовать параметр массива, но он должен быть []интерфейсом{}.

Также ссылаются на rbac_model_matcher_using_in_op, keyget2_model и keyget_model

Например:

[request_definition]
r = sub, obj
...
[matchers]
m = r.sub.name в (r.obj.Admins)
e.Enforce(Sub{Name: "alice"}, Obj{Name: "a book", Admins: []interface{}{"alice", "bob"}})

Исполнитель выражения

Оценка совпадений в Casbin осуществляется оценщиками выражений на каждом языке. Касбин объединяет свои возможности для обеспечения единого PERM языка. Кроме того, предложенный здесь синтаксис модели эти выражения могут обеспечить дополнительную функциональность, которая может не поддерживаться другим языком или реализацией. Используйте его на свой страх и риск.

Оценщики выражений, используемые каждой реализацией Casbin являются:

ОсуществлениеЯзыкИсполнитель выражения
CasbinGolanghttps://github.com/Knetic/govaluate
jCasbinJavahttps://github.com/killme2008/aviator
Node-CasbinNode.jshttps://github.com/donmccurdy/expression-eval
PHP-CasbinPHPhttps://github.com/symfony/expression-language
PyCasbinPythonhttps://github.com/danthedeckie/simpleeval
Casbin.NETC#https://github.com/davideicardi/DynamicExpresso
Casbin4DДельфиhttps://github.com/casbin4d/Casbin4D/tree/master/SourceCode/Common/Third%20Party/TExpressionParser
casbin-rsРжаваhttps://github.com/jonathandturner/rhai
casbin-cppC++https://github.com/ArashPartow/exprtk

::note Если вы столкнулись с проблемой производительности Касбина, это, вероятно, вызвано низкой эффективностью оценщика выражения. Вы можете послать запрос Касбину или вычислитель выражений непосредственно для советов по ускорению. Подробности смотрите в разделе Бенчмаркеты. :::

← Поддерживаемые моделиЭффект →
  • Определение запроса
  • Определение политики
  • Стратегический эффект
  • Матчеры
  • Несколько разделов типа
    • Special Grammer
    • Исполнитель выражения
Casbin
Docs
Getting StartedManagement APIRBAC APIMiddlewares
Community
Who's using Casbin?Stack Overflow
Casbin          jCasbin
Node-Casbin   PHP-CasbinPyCasbin          Casbin.NETCasbin-CPP        Casbin-RS
Follow @casbinHQ
Copyright © 2022 Casbin Organization