Вступ
У сучасному світі веб-розробки все частіше виникає потреба в створенні додатків, які можуть обслуговувати множину клієнтів або проектів в рамках однієї системи. Такий підхід називається мультитенантністю. Одним з ключових аспектів мультитенантної системи є ефективне управління правами доступу, яке повинно враховувати специфіку кожного “тенанта” або проекту.
У цій статті ми розглянемо процес створення гнучкої системи управління правами доступу для мультитенантного додатку на базі Laravel. Ми пройдемо весь шлях від проектування архітектури до реалізації конкретних функцій, приділяючи особливу увагу аспектам безпеки та продуктивності.
Огляд архітектури
Перш ніж перейти до деталей реалізації, важливо визначити основні компоненти нашої системи:
- Project (Проект): Це наш “тенант”. Кожен проект є окремою сутністю зі своїми користувачами, ролями та правами.
- ProjectUser (Користувач проекту): Представляє користувача в контексті конкретного проекту. Один фізичний користувач може бути учасником кількох проектів з різними ролями.
- ProjectRole (Роль проекту): Визначає набір прав доступу в рамках проекту. Наприклад, “Адміністратор”, “Редактор”, “Переглядач”.
- ProjectPermission (Право доступу проекту): Конкретне право, наприклад, “створення користувачів”, “редагування документів” тощо.
Зв’язки між цими сутностями можна описати наступним чином:
- Проект має багато користувачів (ProjectUser).
- Проект має багато ролей (ProjectRole).
- Роль має багато прав доступу (ProjectPermission) через проміжну таблицю.
- Користувач проекту може мати одну або кілька ролей.
Структура бази даних
Для реалізації нашої системи ми будемо використовувати наступні таблиці:
projects:- id
- name
- created_at
- updated_at
project_users:- id
- project_id (зовнішній ключ до projects)
- user_id (зовнішній ключ до users)
- created_at
- updated_at
project_roles:- id
- project_id (зовнішній ключ до projects)
- name
- description
- created_at
- updated_at
project_permissions:- id
- name
- description
- created_at
- updated_at
project_role_permissions:- project_role_id (зовнішній ключ до project_roles)
- project_permission_id (зовнішній ключ до project_permissions)
project_user_roles:- project_user_id (зовнішній ключ до project_users)
- project_role_id (зовнішній ключ до project_roles)
Особливості архітектури
- Ізоляція даних: Кожен проект має свої власні ролі та користувачів, що забезпечує ізоляцію даних між тенантами.
- Гнучкість: Система дозволяє створювати унікальні набори ролей та прав для кожного проекту.
- Масштабованість: Архітектура дозволяє легко додавати нові проекти без змін в структурі системи.
- Безпека: Права доступу перевіряються на рівні проекту, що запобігає несанкціонованому доступу між проектами.
У наступній частині ми розглянемо реалізацію моделей та їх взаємозв’язків у Laravel.