Иерархические роли/разрешения доступа
Я хочу построить иерархический контроль доступа к базе ролей.
Это моя текущая схема:
В настоящее время у меня есть два варианта построения этой системы:
прикрепить все необходимые разрешения для роли (не-иерархические)
прикрепить только специальные разрешения" уровня " и наследовать те, которые имеют более низкие уровень
есть ли лучший подход или просто зависит от моих потребностей проекта?
Я склонен выбирать иерархический только из-за простоты. Если я это сделаю, есть ли лучший способ выбора уровней разрешений, возможно, с помощью двоичных чисел?
Вариант 2 будет иметь некоторые уровни для ролей, и у меня будут номера уровней для разрешений. Поэтому, когда я создаю Full Administrator
роль унаследует все другие разрешения, так как это будет Уровень 4, а другие разрешения будут иметь число меньше, чем Уровень 4 (или 4000).
это перебор?
1 ответов
Я рекомендую пойти с вариация "подход #1" - неиерархических роли.
Я работал с подобными системами с большим успехом. Хотя на первый взгляд этот подход может показаться "менее структурированным", он относительно прост и очень гибок; , когда разрешение нескольких ролей для каждого пользователя и определение правил агрегирования разрешений.
против иерархий (для ролей)
как "иерархия OO", используя иерархия ролей приводит к строгой подстановке отношений. Это затрудняет определение ролей на основе изменяющихся требований.
например, возможно, в будущем потребуется учетная запись "Администратор", которая не может создать свои собственные сообщения. Иерархия (и отношение подстановки) предотвращает это без изменения самой древовидной структуры, потому что" полный администратор "-это"платный пользователь".
запросы к истинной иерархии больше сложный в SQL; особенно в реализациях, которые не поддерживают рекурсивные запросы, такие как MySQL. Переключение на иерархию с использованием вложенного набора или материализованного подхода заставляет дополнительную структуру только над отношением "родитель-потомок".
вам это просто не нужно; чем сложнее программное обеспечение, тем труднее писать и поддерживать. В то время как иерархии очень хороши в некоторых случаях - например, с описью материала или генеалогией или структурой каталогов - просто нет "необходимости" в большинство моделей разрешений ролей/групп.
для (мульти) роли
роли, без зависимости "родительского типа", функционируют больше как "интерфейсы OO" - ну, может быть признака состава было бы более уместно, если аналогии будут растянуты. Реализация (чтение: предоставленные разрешения) каждой роли может измениться независимая любой другой роли, что делает его чрезвычайно гибким. И, как и интерфейсы, более одной роли может быть назначена данному Пользователь / сущность.
запросы против flat User <M-M> Role <M-M> Permission
модель намного проще в SQL (с рекурсивной поддержкой или без нее, или с дополнительной структурой), потому что есть просто нет иерархия ролей для прохождения.
группы ACL Windows (давайте проигнорируем группы вложенности) работают так же, как роли; пользователь принадлежит к одной или нескольким группам, которые предоставляют (или отрицают, но это другая ситуация) разрешения.
есть торт и съесть его Слишком!--12-->
на вариация Я рекомендую, и намекнул выше, чтобы позволить агрегация разрешения по ролям. Простая модель агрегирования такова:
-
пользователь имеет объединение разрешений от все роли, которые они назначены.
(эффективные разрешения обычно создаются во время авторизации, но без иерархии также относительно просто запрашивать в язык SQL.)
таким образом, разрешения привязаны к роли с небольшим или без перекрытия, как показано в "подходе #2", с этой разницей: Иерархии Нет.
например, чтобы разрешить специальному администратору, который может искать сообщения (и удалять "плохие" сообщения), можно просто назначить "основного пользователя"и роли "ограниченный администратор"1.
С помощью неиерархических система multi-роли способная позволяет этому чисто, shrugging с тяготы иерархии, пока все еще обеспечивающ гибкие/composable/конфигурируемые архетипы роли.
1 это не особенно хороший пример. На самом деле роли должны иметь разные названия (например. "Поддержка учетной записи "или" модератор контента") и охватывают различные наборы разрешений; они, вероятно, будут меняться с течением времени на основе проб и ошибок и вкуса месяца бизнес правила.
хотя я выступал против иерархии для таких, в более сложных системах может возникнуть необходимость разрешить отношения между ролями, в первую очередь для группировки таких. Это отношение обычно должно быть независимая действующих разрешений, применяемых, существующих для других управленческих целей.