table В таблице ROLES хранится перечень ролей:

NAME – название роли;

IS_FOLDER – флаг, указывающий является ли роль папкой. Папки предназначены для удобства представления ролей и используются исключительно для их группировки. Функциональность ролей-папок ограничена рядом запретов:

с помощью роли-папки нельзя выдать разрешение на доступ к объекту;

роль-папку нельзя назначить пользователю;

роль-папку нельзя сделать потомком для другой роли, если она также не является папкой.

table Роли организованы в древовидную структуру, описание которой хранится в таблице ROLES_TREE:

PARENT_ID (FK) – роль-родитель;

CHILD_ID (FK) – роль-потомок.

table Для удобства работы содержимое таблицы ROLES_TREE автоматически реплицируется в таблицу ROLES_TREE_EXT, где для каждого родителя хранится список всех его потомков:

ANCESTOR_ID (FK) – ссылка на роль-родитель;

DESCENDANT_ID (FK) – ссылка на роль-потомок.

Роли являются, по сути, совокупностью пользователей, объединенных одинаковыми правами. То есть для пользователей с одинаковым функционалом предназначается одна и та же роль. Роль-родитель предоставляет пользователю также и все права, задаваемые ее ролями-потомками. Например, роли, определяющие функционал подчиненных, будучи потомками роли начальника отдела дают ему возможность совершать все доступные им операции:

Users_Roles

Таким образом, задача определения прав пользователя с ролью-родителем высокого уровня сводится в том числе и к определению прав всех его ролей-потомков. Чем больше уровней в дереве ролей, тем это более трудоемкая задача. Для оптимизации этих запросов и существует таблица ROLES_TREE_EXT, где для каждой роли в явном виде указаны все роли-потомки независимо от их уровня вложенности. Механизмы проверки прав пользователя, реализуемые ядром, работают именно с такими оптимизированными таблицами, которые заполняются автоматически, их можно отличить суффиксу _EXT в названии.