У меня есть модель базы данных с таблицей пользователей и таблицей ролей. Я хочу контролировать доступ (права) до 10 различных элементов. Доступ может быть предоставлен либо роли, либо одному пользователю. Ниже приведена таблица определений пользователей, ролей и элементов:
CREATE TABLE users
(
id serial NOT NULL PRIMARY KEY,
username character varying UNIQUE,
password character varying,
first_name character varying,
last_name character varying,
...
);
CREATE TABLE roles
(
id serial NOT NULL PRIMARY KEY,
name character varying NOT NULL,
description character varying,
...
);
CREATE TABLE element_1
(
id serial NOT NULL PRIMARY KEY,
name character varying NOT NULL,
description character varying,
...
);
...
Теперь у меня есть два разных способа оформления прав. Одна таблица со столбцом типа прав или 10 таблиц прав - по одной для каждого элемента, доступ к которому я хочу контролировать.
Каковы плюсы и минусы одной таблицы прав против одной таблицы прав на элемент? - или это более подходящий способ сделать это?
database-design
best-practices
taudorf
источник
источник
Ответы:
Прежде всего, какую модель безопасности вы планируете внедрить? Управление доступом на основе ролей (RBAC) или Дискреционное управление доступом (DAC)?
увидеть источник
1) В RBAC: вам нужна таблица ElementType для назначения прав на роль (пользователям назначаются роли (и)). RBAC определяет: «Что может сделать эта роль / пользователь». Администратор назначает права ролям и разрешения ролям, назначает пользователей ролям для доступа к ресурсам. 2) В ЦАП: пользователи и роли имеют права на элементы через список контроля доступа (владение). ЦАП определяет: «у кого есть доступ к моим данным». Пользователь (владелец) предоставляет разрешения на принадлежащий ему ресурс.
В любом случае я предлагаю эту модель данных:
(отношения один на один)
1) RBAC (отношения многие ко многим)
2) ЦАП (отношения многие ко многим)
источник
С таблицей прав для каждого элемента, как только вы добавите элемент, вам нужно будет добавить таблицу. Это добавит к обслуживанию приложений.
Недостатком размещения всего в одной таблице является то, что вы можете столкнуться с проблемами масштабирования, но их можно устранить с помощью секционирования, материализованных представлений и / или виртуальных столбцов. Вероятно, такие меры не будут необходимы.
Что касается дизайна таблицы, если бы это было в Oracle, я мог бы предложить что-то вроде этого:
Код пакета может использовать последовательность UserRoleID для заполнения идентификатора в таблице «Пользователи» и идентификатора в таблице «Роли» по мере необходимости. В таблице разрешений могут быть элементы, назначенные ролям, которые, в свою очередь, назначаются пользователям и / или элементы которых назначаются непосредственно пользователям.
источник