03. Приоритеты контекстов
В процессе вычисления прав доступа требуется согласовать разные контексты, которые могут пересекаться по области действия (по объектам доступа). Например, согласование контекстов требуется для формулирования прав доступа “Разрешить все атласы кроме этих двух”.
Процесс согласования происходит либо внутри персональных прав доступа либо внутри групповых прав доступа.
Процесс согласования контекстов между персональными правами доступа и групповыми правами доступа не происходит.
Области действия контекстов
ключ | значение | интерпретация |
---|---|---|
schema_name | * | все атласы (имя схемы ds_* ) |
schema_name | = | Атлас, которым владеет пользователь |
schema_name | строка | имя схемы (конкретное значение) |
table_name | null | все таблицы |
table_name | строка | имя таблицы (конкретное значение) |
object_id | null | все объекты (все записи) |
object_id | = | объект, привязанный к пользователю |
object_id | число | объект, с указанным id (конкретное значение) |
В целях безопасности, нельзя сформулировать выражение “Любая таблица в любой схеме”, так как отсутствует возможность использовать null
для имени схемы.
Зависимые контексты
Права доступа задаются на объекты (строки в таблицах). Объекты адресуются уникальными идентификаторами. Если требуется задать контекст для всех объектов определённого типа, вместо идентификатора используется значение null
. Имя схемы, равное *
, означает любой атлас. Имя схемы, равное =
, означает атласы, принадлежащие пользователю, либо же пользователь является разработчиком этих атласов. Также можно использовать null
для указания любых типов объектов в определённой схеме. Использование null
для указания любой схемы не поддерживается из соображений безопасности.
Схема | Таблица | id запсиси | права доступа |
---|---|---|---|
* | null | null | {"R":false} |
= | null | null | {"R":true} |
ds_12 | null | null | {"R":false} |
ds_12 | dashlets | null | {"R":true} |
ds_12 | dashlets | 12 | {"R":false} |
Пример зависимых контекстов
При движении от самых общих контекстов к частным должны меняться права доступа (чередование true/false), иначе в подобных правилах нет смысла.
Набор таких правил согласовывается на каждом уровне отдельно, например в персональных правах или в групповых правах сопоставляются правила со схемой *
, затем =
и далее для каждого уникального имени атласа.
При проверке прав доступа, согласование контекстов идёт от частного к общему, и первый подходящий контекст даёт права доступа, которые применяются к искомому объекту.
Например, в нашем примере действие R
для ds_12.dashlets/12
запрещено, а действие R
для ds_12.dashlets/33
разрешено.
Примеры взаимодействия персональных и групповых прав доступа
Персональный доступ на все дэшборды
// персонально
{
"schema_name": '*',
"table_name": "dashboards",
"object_id": null,
"rights": {"R":true}
}
// групповые
{
"schema_name": "ds_20",
"table_name": "dashboards",
"object_id": null,
"rights": {"R":false}
}
В примере персональными правами разрешён доступ ко всем дэшбордам в любом атласе, запреты в группе не имеют силы, так как имеют приоритет ниже, чем персональные права.
Персональные права имеют более высокий приоритет, чем групповые права. Запреты имеют более высокий приоритет, чем разрешения.
Персональный запрет на все дэшборды
// персонально
{
"schema_name": '*',
"table_name": "dashboards",
"object_id": null,
"rights": {"R":false}
}
// групповые
{
"schema_name": "ds_20",
"table_name": "dashboards",
"object_id": null,
"rights": {"R":true}
}
В примере персональными правами запрещён доступ ко всем дэшбордам в любом атласе, разрешения в группе не имеют силы, так как имеют приоритет ниже, чем персональные права.
Доступ на все объекты, кроме указанных
// персонально
{
"schema_name": "ds_20",
"table_name": "dashboards",
"object_id": null,
"rights": {"R":false}
}
// групповые
{
"schema_name": '*',
"table_name": "dashboards",
"object_id": null,
"rights": {"R":true}
}
Персональный запрет действует на все дэшборды в атласе ds_20
. При запросе дэшбордов из атласа ds_3
, персонлаьный контекст не удовлетворит условиям поиска и сработает групповой контекст, в котором действует разрешение читать дэшборды из всех атласов, в том числе из атласа ds_3
.
Разрешение на операцию, которое можно отменить через группу.
Если разрешение выдано в сайтовой роли, то его можно отменить в персональных или групповых правах доступа.
Запрет, установленный в сайтовой роли действует немедленно и не может быть отменён через персональные или групповые права!
// сайтовая роль разрешает закачивать в систему ресурсы
// в атласы, которые принадлежат пользователю
{
"schema_name": "=",
"table_name": "resources",
"object_id": null,
"rights": {"C":true,"Imp":true}
}
// в группе, на тот же контекст выставлен запрет,
// и он перекрывает разрешения, выданные в сайтовой роли.
{
"schema_name": '=',
"table_name": "resources",
"object_id": null,
"rights": {"C":false,"Imp":false}
}