Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.07.2017, 00:03
Интересующийся
Отправить личное сообщение для Ceргей Посмотреть профиль Найти все сообщения от Ceргей
 
Регистрация: 04.01.2012
Сообщений: 23

Конструктор прав доступа
Всем привет!
Было бы интересно услышать ваши мнения насчет одной штуки, которую я написал, чтобы понять - вообще нужно это или нет.

Как бы громко это ни звучало, но мой проект нацелен на разработчиков cms, crm и т.п. Вся фишка заключается в том, что любая система имеет свою систему доступа. Эти системы могут различаться в мелочах, но как правило в основном сходны в одном - в наличии прав и групп прав. То есть по сути это является "костяком" во многих системах. Так вот: я решил написать сервис, который этот "костяк" мог бы генерировать в SQL-таблицы.

На вход можно отдать JSON (это сжатый вид)

{"p":[{"t":"Новости","r":["1|read_news|Чтение новостей","2|edit_news|Редактирование новостей","3|add_news|Добавление новостей","4|remove_news|Удаление новостей"],"v":[{"i":"1|guests|Гости","e":[1],"d":[],"_":[],"p":[]},{"i":"2|moderators|Модераторы","e":[2,3],"d":[],"_":[],"p":[1]},{"i":"3|administrators|Администраторы","e":[4],"d":[],"_":[],"p":[1,2]}],"c":{"r":{},"v":{"a":"packages","_":"id","t":"title","n":"name","r":["32|2|e_rights"]}}}]}


На выход можно получить следующее:
Таблица прав
Код:
INSERT INTO `rights` (`id`, `name`, `title`) VALUES (1, 'read_news', 'Чтение новостей');
INSERT INTO `rights` (`id`, `name`, `title`) VALUES (2, 'edit_news', 'Редактирование новостей');
INSERT INTO `rights` (`id`, `name`, `title`) VALUES (3, 'add_news', 'Добавление новостей');
INSERT INTO `rights` (`id`, `name`, `title`) VALUES (4, 'remove_news', 'Удаление новостей');
И таблица пакетов прав (или групп, кому как удобнее)
В e_rights перечислены все активные права пакета, включая права подпакетов

Код:
INSERT INTO `packages` (`id`, `name`, `title`, `e_rights`) VALUES (1, 'guests', 'Гости', 'read_news');
INSERT INTO `packages` (`id`, `name`, `title`, `e_rights`) VALUES (2, 'moderators', 'Модераторы', 'read_news,edit_news,add_news');
INSERT INTO `packages` (`id`, `name`, `title`, `e_rights`) VALUES (3, 'administrators', 'Администраторы', 'read_news,edit_news,add_news,remove_news');
Выгрузку можно настроить под свой проект (INSERT/UPDATE), возможно сохранение прав и пакетов в одной таблице. Также возможна выгрузка без ID. Каких-либо ограничений на количество прав и пакетов, а также вложенности пакетов не существует.

Сервис не требует регистрации, полностью бесплатен, данные на сервер не сохраняются.
Вот ссылка http://myrbac.com/constructor/
Ответить с цитированием
  #2 (permalink)  
Старый 12.07.2017, 05:45
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Ceргей, офигеть, и в чем же ваше ноу-хау?

Если в системе предполагается будущее расширение прав, как собственно и любой иной опции/характеристики, присущих сущности, то они и будут храниться в связанной таблице, тут вы Америки не открыли.

Но если права определены, что зачастую и нужно, то иметь отдельную таблицу для них это накладно, а права можно описать в таблице самих пользователей полем тип SET если пользователь может быть наделен несколькими правами или полем типа ENUM если только одно право.

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

Всю информацию о таблице пользователей можно получить ее представлением:

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = "base" AND TABLE_NAME = "table"

и в выборке для COLUMN_TYPE равных enum или set получить информацию для списков (в случае set список будет multiple):

//параметры enum/set
preg_match_all("/(?<=')[^',]+(?=')/ui", $row->column_type, $val);
//опции списка enum
$enum = array_combine(range(1, count($val[0])), $val[0]);
//оции списка set
$set = array_combine(array_map(function($k) {
    return 1 << $k;
}, array_keys($val[0])), $val[0]);


И даже в 32-ой системе таким набором set вполне хватит описать права нужные, конечно если не иметь: разрешено добавлять "А", разрешено добавлять "Б", ...

Последний раз редактировалось laimas, 12.07.2017 в 06:01.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Асинхронный конструктор khusamov Node.JS 3 30.06.2016 07:59
Встроить конструктор чехлов в CMS Drupal 6 weboreh Работа 0 05.11.2014 11:23
JS конструктор в обэкте domius Ваши сайты и скрипты 2 07.06.2014 22:53
Практика: Функция конструктор и геттер. Magneto Общие вопросы Javascript 2 07.07.2013 14:01