Синтаксис правил политик слоя DATA¶
Синтаксис правил политик основан на синтаксисе Casbin. Правило политики описывается в виде логического выражения, которое в итоге должно возвращать булево значение.
(r.obj.data.count < 3 ) && ( r.obj.data.dataText == "data2" ) && ((r.obj.isDeleted == false) || keyMatch(r.obj.description\, "про*"))
Логическое выражение описывается следующими элементами:
- Группирующие скобки.
- Логические операторы.
- Операторы сравнения.
- Арифмитические операторы.
- Операторы множеств.
- Функции.
- Атрибуты субъекта или объекта.
- Значения разных типов.
Группирующие скобки
Группирующие скобки позволяют создавать сложные логические выражения.
- () – открывающая и закрывающая скобки группируют логические выражения. Рекомендуется для явного определения границ выражений. Пример:
(r.obj.data.dataText == "data2") && ((r.obj.data.count < 3) || keyMatch(r.obj.description\, "про*"))
- [] – открывающая и закрывающая квадратные скобки обозначают массив, список значений. Пример:
r.obj.name in ["abc", "def"]
Логические операторы
Логические операторы вычисляют булево-значение объединенных логических выражений.
- || – логический ИЛИ оператор.
Примеры:
(r.obj.data.count < 3 ) || (r.obj.data.dataText == "data2") * && – логический И оператор.
(r.obj.data.count < 3 ) && ( r.obj.data.dataText == "data2" ).
- ! – оператор отрицания НЕ для инверсии логического выражения. Пример:
!r.sub.attributes.isFired
Операторы сравнения
Операторы сравнения вычисляют булево-значение логического выражения.
- == – оператор сравнения РАВНО. Пример:
r.obj.name == "data3"
- != – оператор сравнения НЕ РАВНО. Пример:
r.obj.name != "data3"
· > – оператор сравнения БОЛЬШЕ. Пример:
r.obj.data.sum > 0.25
- < – оператор сравнения МЕНЬШЕ. Пример:
r.obj.data.sum < 10000
- <= – оператор сравнения МЕНЬШЕ ИЛИ РАВНО. Пример:
r.obj.data.sum < 10000
- = – оператор сравнения БОЛЬШЕ ИЛИ РАВНО. Пример:
r.obj.data.sum > 0.99
Арифметические операторы
Арифметические операторы используются для числовых выражений внутри выражений сравнения.
– арифметический оператор СЛОЖЕНИЯ. Пример:
r.obj.data.sum > (0.99 + r.obj.data.partSum)
- ·- – арифметический оператор ВЫЧИТАНИЯ. Пример:
r.obj.data.sum > (10000 - r.obj.data.partSum)
- / – арифметический оператор ДЕЛЕНИЯ. Пример:
1000 < (r.obj.data.sum / r.obj.data.count)
- · * – арифметический оператор УМНОЖЕНИЯ. Пример:
r.obj.data.sum > (r.obj.data.prise * 1000)
Операторы множеств
- in – оператор объединения множеств, ИСТИНА, когда левый операнд или левое множество входит в правое множество. Пример:
r.obj.name in ["abc", "def"] * !in – оператор вычитания множеств
["ВАЖНО", "КОНФИДЕНЦИАЛЬНО"] !in r.obj.data.labels , где для r.obj.data.labels cardinality = MULTI
Функции
checkAcl – функция включения ACL при проверке прав на объекты. Имеет фиксированный формат checkAcl(r.obj.acl\, r.sub\, r.act). Пример: checkAcl(r.obj.acl\, r.sub\, r.act).
keyMatch – функция соответствия маске. имеет формат keyMatch (атрибут_субъекта или атрибут_объекта \, любое значение, может содержать ''). Вычисляет булево-значение аналогично SQL-запросу: первый_аргумент LIKE второй_аргумент. Ресурсоемкая, значительно влияет на быстродействие Системы. Пример: keyMatch(r.obj.description\, "договор").
regexMatch – функция соответствия регулярному выражению. Имеет формат regexMatch (атрибут_субъекта или атрибут_объекта \, регулярное выражение, согласно определению в POSIX 1003.2 ). Вычисляет булево-значение соответствия значения атрибута субъекта/объекта указанному регулярному выражению. Рресурсоемкая, значительно влияет на быстродействие Системы. Пример: regexMatch(r.obj.name\, "[a-zA-Z]+").
Атрибуты субъекта или объекта
Наименование атрибута субъекта. Имеет префикс «r.sub». Должен соответствовать регулярному выражению «[a-zA-Zа-яА-Я0-9_-]+». Пример: r.sub.roles.
Наименование атрибута объекта. Наименование системного атрибута с «persistenceType = RELATIONAL_COLUMN» имеет префикс «r.obj». Наименование динамического атрибута объекта с «persistenceType = DATA_COLUMN» имеет префикс «r.obj.data». Должно соответствовать регулярному выражению «[a-zA-Zа-яА-Я0-9_-]+». Пример: r.obj.data.passportNumber.
Значения разных типов
null – null-значение. Пример:
r.obj.data.sign == null
true – булево-значение ИСТИНА. Пример:
r.obj.isDeleted == true
false – булево-значение ЛОЖЬ. Пример:
r.obj.isDeleted == false
Строковое значение. Пример:
ketMatch(r.obj.description\, "товар")
Числовое значение, должно соответствовать регулярному выражению -?[0-9]+('.'[0-9]+)?. Пример:
r.obj.data.temperature <= -16.6