RBAC+ACL модель
Это гибридная модель, где: пользователь имеет общую роль доступа (например, can_manage_company или viewer_of_sphere) и у этой роли есть контекст, т.е. привязка к объекту: компании или сфере
Таблицы
SQL запросы для PostgrSQLPostgreSQL
Пользователи:
CREATE TABLE users (
user_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
username VARCHAR(100)TEXT UNIQUE NOT NULL,
fio VARCHAR(100)TEXT NOT NULL DEFAULT '',
phone VARCHAR(12)TEXT NOT NULL,
password_hash TEXT NOT NULL
);
Роли:
CREATE TABLE roles (
role_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
role_name TEXT NOT NULL UNIQUE,
role_description TEXT
);
Сферы:
CREATE TABLE fields (
field_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
field_name TEXT NOT NULL
);
Компании:
Связь между всеми параметрами
CREATE TABLE user_role_assignments (
user_id INTEGER REFERENCES users(id),
role_id INTEGER REFERENCES roles(id),
field_id INTEGER REFERENCES fields(id), -- либо это...
company_id INTEGER REFERENCES companies(id), -- ...либо это
PRIMARY KEY (user_id, role_id, field_id, company_id),
CHECK (
(field_id IS NOT NULL AND company_id IS NULL) OR
(field_id IS NULL AND company_id IS NOT NULL)
)
);