table В таблице PERMISSONS хранится перечень разрешений:

ID – идентификатор разрешения, по которому производится проверка в контрольной точке программного кода;

NAME – название разрешения.

table В таблице ROLE_PERMISSONS хранится перечень разрешений привязанных к ролям:

PERMISSON_ID (FK) – разрешение, привязываемое к роли;

ROLE_ID (FK) – роль, к которой привязывается разрешение;

REVOKED – отмена привязки разрешения к роли. Используется для отмены наследуемой ролью-родителем от потомка привязки разрешения.

Роль-родитель обладает всеми правами, предоставляемыми ее ролями-потомками. Это же относится и к разрешениям. Но бывают ситуации, когда роль потомок имеет разрешение, а для роли-родителя оно не нужно. Например, роль кладовщика имеет привязанное разрешение на осуществление отгрузки товара со склада. Одновременно она является потомком роли начальника склада. Но начальник склада не является материально-ответственным лицом и не имеет права осуществлять такую отгрузку. Лишить роль-родитель начальника склада такого разрешения можно двумя способами:

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

привязать разрешение также и к роли-родителю, но установить этой связи свойство REVOKED в значение true, тогда роль-потомок будет иметь это разрешение, а роль-родитель нет.

35_important

Также как роль-родитель обладает разрешениями своих ролей-потомков, так она обладает и отменами их разрешений.

Например, привязывая разрешение к роли Младшего подчиненного, мы тем самым выдаем его и ролям-родителям – Старшему подчиненному и Начальнику отдела:

Users_Roles_Tree

Отменив это разрешение для роли Старшего подчиненного, мы тем самым отменим его и для Начальника отдела.

table Для удобства работы содержимое таблицы ROLE_PERMISSIONS автоматически реплицируется в таблицу ROLE_PERMISSONS_EXT, где для каждой роли хранится список всех ее разрешений указанный в явном виде с учетом того, что роль-родитель обладает разрешениями ролей-потомков, если они для нее не отменены свойством REVOKED:

PERMISSION_ID (FK) – ссылка на разрешение;

ROLE_ID (FK) – ссылка на роль.

35_example

Привязав разрешение к роли Младшего подчиненного, мы тем самым добавляем одну запись в таблицу ROLE_PERMISSIONS и три записи в таблицу ROLE_PERMISSIONS_EXT:

Users_Permis_Examp_1

Отменив это разрешение для роли Старшего подчиненного, мы тем самым отменим его и для Начальника отдела, добавив еще одну запись в таблицу ROLE_PERMISSIONS и удалив две записи в таблице ROLE_PERMISSIONS_EXT:

Users_Permis_Examp_2