@NioTrest

Дизайн базы данных для пользовательских прав доступа?

Часть вывода `php artisan migrate --pretend`

InteractiveForms: create table `application_models` (`id` bigint unsigned not null auto_increment primary key, `created_at` datetime not null, `updated_at` datetime not null, `name` varchar(255) not null, `title` varchar(256) not null) default character set utf8 collate utf8_unicode_ci
InteractiveForms: alter table `application_models` add unique `application_models_name_unique`(`name`)
InteractiveForms: create table `application_model_instances` (`id` bigint unsigned not null auto_increment primary key, `created_at` datetime not null, `updated_at` datetime not null, `model_id` bigint unsigned not null, `creator_id` bigint unsigned null) default character set utf8 collate utf8_unicode_ci
InteractiveForms: alter table `application_model_instances` add constraint `fk_5e4adfe3e91ac5916249954803b78d92_model_id` foreign key (`model_id`) references `application_models` (`id`)
InteractiveForms: alter table `application_model_instances` add constraint `fk_5e4adfe3e91ac5916249954803b78d92_creator_id` foreign key (`creator_id`) references `application_users` (`id`)
InteractiveForms: alter table `application_model_instances` add index `application_model_instances_model_id_index`(`model_id`)
InteractiveForms: create table `application_model_fields` (`id` bigint unsigned not null auto_increment primary key, `created_at` datetime not null, `updated_at` datetime not null, `model_id` bigint unsigned not null, `title` varchar(256) not null, `name` varchar(256) not null, `type` enum('field_text', 'field_textarea', 'field_checkbox', 'field_radio', 'field_select_inline', 'field_select_list', 'field_select_dropdown', 'field_datetime', 'field_date', 'field_email', 'field_phone', 'field_url', 'field_image', 'field_file', 'field_coordinate', 'field_user') not null) default character set utf8 collate utf8_unicode_ci
InteractiveForms: alter table `application_model_fields` add constraint `fk_2d216afb8aca7f83e97be47b6cb3ddf1_model_id` foreign key (`model_id`) references `application_models` (`id`)
InteractiveForms: alter table `application_model_fields` add unique `application_model_fields_name_model_id_unique`(`name`, `model_id`)
InteractiveForms: create table `application_roles` (`id` bigint unsigned not null auto_increment primary key, `created_at` datetime not null, `updated_at` datetime not null, `name` varchar(255) not null, `title` varchar(256) not null) default character set utf8 collate utf8_unicode_ci
InteractiveForms: alter table `application_roles` add unique `application_roles_name_unique`(`name`)
InteractiveForms: create table `application_role_model_permissions` (`id` bigint unsigned not null auto_increment primary key, `model_id` bigint unsigned not null, `role_id` bigint unsigned not null, `can_create` tinyint(1) not null default '0', `can_all` enum('can_see', 'can_edit') null) default character set utf8 collate utf8_unicode_ci
InteractiveForms: alter table `application_role_model_permissions` add constraint `fk_6733a186b1563cb971f668fa04a37a95_model_id` foreign key (`model_id`) references `application_models` (`id`)
InteractiveForms: alter table `application_role_model_permissions` add constraint `fk_6733a186b1563cb971f668fa04a37a95_role_id` foreign key (`role_id`) references `application_roles` (`id`)
InteractiveForms: alter table `application_role_model_permissions` add index `application_role_model_permissions_model_id_role_id_index`(`model_id`, `role_id`)
InteractiveForms: create table `application_role_model_permissions_by_user_fields` (`id` bigint unsigned not null auto_increment primary key, `created_at` datetime not null, `updated_at` datetime not null, `role_id` bigint unsigned not null, `model_field_id` bigint unsigned not null, `can_this` enum('can_see', 'can_edit') null, `can_dependent` enum('can_see', 'can_edit') null) default character set utf8 collate utf8_unicode_ci
InteractiveForms: alter table `application_role_model_permissions_by_user_fields` add constraint `fk_4b244bfa536a4df63d1d58ba0cc27997_role_id` foreign key (`role_id`) references `application_roles` (`id`)
InteractiveForms: alter table `application_role_model_permissions_by_user_fields` add constraint `fk_4b244bfa536a4df63d1d58ba0cc27997_model_field_id` foreign key (`model_field_id`) references `application_model_fields` (`id`)
InteractiveForms: alter table `application_role_model_permissions_by_user_fields` add index `role_id`(`model_field_id`)
InteractiveForms: create table `application_role_users` (`id` bigint unsigned not null auto_increment primary key, `user_id` bigint unsigned not null, `role_id` bigint unsigned not null) default character set utf8 collate utf8_unicode_ci


Что есть:
application_models - типы моделей (как отдельные таблицы в бд)
application_model_instances - сами модели,
application_model_fields - поля моделей
application_role_model_permissions - глобальные права на модели в зависимости от роли (например, роль 'редактор' может редактировать все модели с типами: 'новость' и 'событие')
application_role_model_permissions_by_user_fields - самое сложное, в application_model_fields может быть несколько типов полей (текстовые, файлы, выбор из нескольких и т.д.) и также ссылка на пользователя. application_role_model_permissions_by_user_fields содержит информацию о том, что если пользователь упомянут в каком-то поле модели, то у него есть такие-то права.

Например, модель 'задача' содержит два поля типа пользователь: 'ответственные' и 'кто может смотреть'

Если пользователь упомянут в отвественных, то он может редактировать задачу, если упомянут в 'кто может смотреть' - может только смотреть задачу, в противном случае у него нет доступа.

Проблема в том, что application_role_model_permissions_by_user_fields содержит ссылку model_field_id на application_model_fields и эта ссылка считается валидной, только если model_field_id ссылается на поле с типом 'пользователь', в противном случае эти данные никакого смысла не имеют.

Может есть лучший подход?
  • Вопрос задан
  • 191 просмотр
Пригласить эксперта
Ответы на вопрос 1
Alex_Wells
@Alex_Wells
PHP/Kotlin
О боже..... Вы бы хоть документацию почитали, прежде чем делать ЭТО.

Во-первых, есть пакет bouncer, поищите. Позволяет выдавать пермишенсы на любые entity либо по отдельности, гибкий вариант.
Во-вторых, я на 99.99% уверен, что в интернете уже есть полностью готовый вариант dynamic моделей, и прицепить к ним пермишены не составит труда. В чем смысл писать велосипеды?
В третьих, делать три таблицы с одинаковым назначением это глупо.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы