Синтаксис для моделей
Модель 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
это как
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" + суффикс;
}
}
Пример использования, см. модель и политика, запрос приводится следующим образом
// Передача в суффикс параметра 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 являются:
Осуществление | Язык | Исполнитель выражения |
---|---|---|
Casbin | Golang | https://github.com/Knetic/govaluate |
jCasbin | Java | https://github.com/killme2008/aviator |
Node-Casbin | Node.js | https://github.com/donmccurdy/expression-eval |
PHP-Casbin | PHP | https://github.com/symfony/expression-language |
PyCasbin | Python | https://github.com/danthedeckie/simpleeval |
Casbin.NET | C# | 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-cpp | C++ | https://github.com/ArashPartow/exprtk |
::note Если вы столкнулись с проблемой производительности Касбина, это, вероятно, вызвано низкой эффективностью оценщика выражения. Вы можете послать запрос Касбину или вычислитель выражений непосредственно для советов по ускорению. Подробности смотрите в разделе Бенчмаркеты. :::