Access Control List (список управления доступом) или ACL — это список правил, которые позволяют управлять доступом на совершение CRUD-операций (create, read, write, delete) в соответствии с бизнес-процессами.
Правила ACL делятся не только по виду CRUD-операции, на которую дается доступ, но и по объекту, на который данный доступ/запрет доступа распространяется (таблица, поле) (см. Типы правил контроля доступа | SimpleOne Documentation).
Особое значение в работе правил ACL играет иерархия, которая построена по 4 уровням доступа:
- Доступ к любой таблице (высший уровень)
- Доступ к конкретной таблице
- Доступ к любому полю в конкретной таблице
- Доступ к конкретному полю в конкретной таблице (низший уровень)
Правила ACL срабатывают в порядке иерархии до тех пор, пока пользователь соответствует правилам ACL.
Логика работы правил ACL похожа на доступ в многоэтажное здание и комнаты в нем: от общего к частному.
Например, необходимо предоставить доступ в комнату (нижний уровень — уровень конкретного поля).
Сначала проверяется доступ в здание (уровень всех таблиц), потом — доступ на конкретный этаж (уровень таблицы), далее — доступ в комнаты (уровень всех полей таблицы) и наконец — доступ в саму комнату (уровень конкретного поля таблицы). Если в данной цепочке на каком-либо из уровней будет выявлено несоответствие правилу ACL, либо данным правилом установлен запрет, то запрет сработает, и проверка на доступ завершится.
Так, например, если доступ в здание и комнату разрешен, но нет доступа на этаж, то проверка закончится на уровне этажа (уровне таблицы), не доходя до уровня комнаты (уровня конкретного поля), и в доступе будет отказано.
Таким образом, правило ACL нижестоящего уровня подчиняется правилам ACL вышестоящих уровней: оно не сработает, если пользователь не соответствует правилам ACL вышестоящих уровней.
Например, если доступ на чтение таблицы (операция read) закрыт согласно правилу ACL на уровне таблицы, то доступ на чтение конкретных полей таблицы также будет закрыт. Если все же создать правила ACL на уровне полей, предоставляющих доступ на чтение, то такие правила попросту не сработают.
В связи с изложенным, при создании правила ACL нужно проверить:
а) наличие правил ACL более верхних уровней и
b) их условия.
Например, если необходимо дать доступ к определенному полю в конкретной таблице, проверяются активные правила ACL :
- для конкретной таблицы
- для всех полей в таблице
- для конкретного поля в таблице
Как различать уровни ACL, проиллюстрировано в таблице ниже:
На первый взгляд такая проверка может быть ясна и не вызывать вопросов. Однако есть ряд особенностей, которые необходимо учитывать при настройке ACL.
1. Доступ к таблицам по умолчанию разрешен
Например, есть таблица Chars с полями A , B , C , D. Необходимо разрешить доступ на чтение (операция read) определенных полей: A и B .
Создано два правила ACL для каждого поля (А и В) с разрешением операции чтения. Однако при проверке выясняется, что пользователю разрешено читать все поля в таблице. Почему так получилось?
По общему правилу, когда создается таблица, доступ ко всем полям таблицы разрешен. Любой пользователь может совершать операции в этой таблице.
Следовательно, чтобы разрешить доступ только к части полей, нужно сначала установить запрет ко всем полям. Для этого создается ACL для всех полей таблицы (отмечен чек-бокс Any fields), которая запрещает доступ к ним (в скрипте указывается answer = false ; )).
После этого создаются ACL для каждого конкретного поля, доступ к которому будет разрешен.
Если не создать запрещающую ACL для всех полей, то последующие ACL с разрешением доступа фактически будут дублировать имеющийся доступ по всей таблице.
2. ACL для всех полей ≠ ACL для таблицы
Обратите внимание, что в примере выше для запрета доступа создается именно ACL для всей полей , а не ACL для таблицы . Тип ACL для всех полей предусмотрен для того, чтобы сократить издержки на создание ACL для каждого поля в таблице. Важно помнить, что уровень таблицы выше уровня полей. Если будет создано ACL с запретом доступа на уровне таблицы, то впоследствии нельзя будет разрешить доступ с помощью ACL на уровне полей. Это то же самое, как дать ключи от всех комнат этажа, но закрыть сам этаж.
Таким образом, если нужно ограничить доступ на часть полей в таблице:
-
создайте ACL на уровне всех полей (отметить чек-бокс Any fields), которое запрещает на доступ.
-
создайте ACL на уровне конкретного поля, которое разрешает доступ.
3. Учитывайте иерархию таблиц при наследовании
При настройке полей важно иметь в виду не только иерархию ACL, но и иерархию таблиц. При создании правила ACL необходимо проверить, является ли таблица дочерней. Если правило ACL создается для дочерней таблицы, то к ней могут применяться правила ACL родительской таблицы.
Например, у таблицы Chars есть родительская таблица UpperChars . Для таблицы UpperChars создано правило ACL, которое запрещает редактирование (операция write).
При этом для таблицы Chars нужно сделать часть полей редактируемыми.
Поскольку правило ACL для таблицы UpperChars , запрещающее редактирование, создано на уровне родительской таблицы, то данное правило применяется и для дочерней таблицы Chars .
Однако, если правило ACL определено для дочерней таблицы, то оно будет иметь преимущество перед правилом ACL для родительской таблицы.
Следовательно, нужно создать отдельное правило на уровне таблицы Chars , разрешающее редактирование таблицы.
Таким образом, необходимо создать правила ACL на трех уровнях:
-
правило ACL на уровне таблицы Chars, разрешающее редактирование в таблице в целом;
-
правило ACL на уровне всех полей таблицы Chars, которое запрещает редактирование всех полей.
-
правило ACL на уровне конкретного поля, которое разрешает редактирование поля.
Если не создать правило ACL для дочерней таблицы, то будет срабатывать правило ACL родительской таблицы.
Аналогичная логика правил ACL применяется и к полям. Правила ACL для полей родительской таблицы применяются к полям дочерней таблицы. Однако, если для полей дочерней таблицы созданы свои правила ACL , то они имеют преимущество над правилами ACL для полей родительской таблицы.
Суммируя сказанное, очередность срабатывания правил ACL с учетом иерархии правил ACL и наследования таблиц выглядит следующим образом:
A. Правила ACL на уровне таблицы:
- дочерней таблицы (если оно есть)
- родительской таблицы
- всех таблиц
B. Правила ACL на уровне всех полей таблицы:
- дочерней таблицы (если оно есть)
- родительской таблицы
- всех таблиц
C. Правила ACL на уровне конкретного поля:
- дочерней таблицы (если оно есть)
- родительской таблицы
- всех таблиц.