Skip to main content

RBAC+ACL модель

Это гибридная модель, где: пользователь имеет общую роль доступа (например, can_manage_company или viewer_of_sphere) и у этой роли есть контекст, т.е. привязка к объекту: компании или сфере

Таблицы

SQL запросы для PostgreSQL

Пользователи: 

CREATE TABLE users (
    user_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    username TEXT UNIQUE NOT NULL,
    fio TEXT NOT NULL DEFAULT '',
    phone 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 companies (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    field_id INTEGER REFERENCES fields(id)
);

Связь между всеми параметрами

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)
    )
);