Синтаксис правил политик слоя 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