Лучшая модель базы данных для управления доступом на основе ролей (RBAC) [закрыта]

Какова наилучшая схема базы данных для отслеживания управления доступом на основе ролей для веб-приложения?

Я использую Rails, но подключаемый модуль RBAC, связанный с Google, выглядит неподдерживаемым (всего 300 коммитов в SVN; последний был почти год назад).

Концепция достаточно проста, чтобы ее можно было реализовать с нуля, но в то же время достаточно сложна и важна, чтобы ее можно было реализовать правильно.

Так как же другие проектируют и реализуют свою модель RBAC?


person JasonSmith    schedule 10.10.2008    source источник
comment
Используйте фреймворк, реализующий авторизацию за вас. Изучите CanCanCan или другие модели управления доступом на основе атрибутов (ABAC), например. XACML   -  person David Brossard    schedule 15.06.2017


Ответы (10)


Насколько я знаю в этой области, основными действующими лицами RBAC являются:

  • Ресурсы.
  • Разрешения.
  • Пользователи.
  • Роли (т.е. группы).

Ресурсы ‹- требуют -> (один или несколько) Разрешения.

Роли ‹ – это наборы -> (одного или нескольких) разрешений.

Пользователи ‹- могут иметь -> (одну или несколько) ролей.

Таблицы для такой модели будут:

  • разрешение
  • роль
  • Пользователь
  • role_permission
  • user_role

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

person Amr Mostafa    schedule 12.10.2008
comment
Когда вы говорите, что «Ресурсы требуют (одно или несколько) разрешений», я предполагаю, что это для пользовательского интерфейса этого ресурса, который позволяет пользователю устанавливать значения разрешения/запрета для каждого разрешения для каждого пользователя... верно? Если это так, то в вашей схеме БД у вас может быть 10, 20 (или более) возможных ресурсов, связанных с одним разрешением. Например, «Менеджер проекта» имеет разрешение «Создать». Затем вы бы связали такое разрешение с ресурсами проекта, расписания, задачи, документа, расписания (и это лишь некоторые из них), потому что менеджер проекта может создавать все эти ресурсы? Спасибо! - person Jeach; 27.11.2010
comment
Я понимаю это в концепции, но как может выглядеть структура таблицы для основных значений? - person HPWD; 30.07.2015
comment
Как сгруппировать похожие разрешения, чтобы они помогали мне отображать одинаковые во внешнем интерфейсе? - person Jaseem Abbas; 18.10.2015
comment
Возможно, вы захотите рассмотреть AERBAC researchgate.net/profile/D_Kuhn2/publication/ RBAC и ABAC имеют свои преимущества и недостатки. RBAC жертвует усилиями по предварительному структурированию ролей ради простоты администрирования и проверки разрешений пользователей, в то время как ABAC предлагает обратный компромисс: его легко настроить, но анализ или изменение разрешений пользователей может быть проблематичным. - person geoyws; 03.09.2019
comment
Что именно должно быть в таблице разрешений? Не могли бы вы привести пример? - person Sanjay Prajapati; 11.12.2020

Вот простая диаграмма, иллюстрирующая отличный ответ Амра Мостафы

введите здесь описание изображения

person Hanxue    schedule 21.01.2014
comment
Вам не нужно использовать UserRoleID и RolePermissionID. Вместо этого в User_Role комбинация UserID и RoleID должна быть уникальной и первичным ключом. Это то же самое для таблицы Role_Permission с RoleID и PermissionID. - person kipzes; 12.12.2015
comment
хорошая диаграмма, но вы просто упустили модель ресурсов... - person Yordan Georgiev; 30.11.2020
comment
Эта схема неверна. User one-to-many User_Role many-to-one Role one-to-many Role_Permission many-to-one Permission. и сущность Resource опущена. - person Arash; 01.03.2021

Я работаю над подсистемой RBAC здесь, на работе, в этот момент... какое совпадение.

Моя модель основана на строительных блоках различных сущностей в системе, которым требуются разрешения, будь то атрибуты для просмотра/обновления или действия для выполнения. Конечно, в системе также есть разные роли (которые можно назначать пользователям), а связующим звеном, скрепляющим все это, является правило доступа, которое связывает определенную роль, определенный объект, которому требуется разрешение, и предоставленное разрешение. Правило доступа может выглядеть следующим образом:

rule 14: guest role + page name + read permission
rule 46: approver role + add column + execute permission

и так далее. Я оставлю ERD читателю в качестве упражнения ;-) если у вас есть вопросы, оставьте комментарий.

Юваль =8-)

person Yuval    schedule 12.10.2008
comment
Когда вы создаете ресурс, как вы решаете, какие роли и разрешения ему назначить? Вы наследуете их от своих родителей? Это та часть, которая меня озадачивает. Если вы оставите это поле пустым для того, чтобы «кто-то» мог назначить ему роли и разрешения, это приведет к огромным затратам на управление системой. - person Jeach; 17.04.2010
comment
Это действительно накладные расходы, и о них должен позаботиться либо разработчик, пишущий ресурс, либо кто-то, кто отвечает за эту кросс-приложение. Это что-то вроде кода синхронизации... либо он появляется везде, либо он никуда не годится. - person Yuval; 17.04.2010

Вы можете использовать плагин Restful ACL Rails.

person IDBD    schedule 10.10.2008
comment
RESTful_ACL хорош, но не имеет встроенной концепции управления на основе ролей, поэтому на самом деле это не решение RBAC. - person Mark Eirich; 24.08.2012
comment
Ну, Rbac != ACL по-моему. - person mlinuxgada; 25.10.2016

Я думаю, что ответ на ваш вопрос идет так глубоко, как вы хотите. Если вам случится подумать о том, чтобы поместить роли в группы, а затем связать группы с пользователями, этого будет недостаточно. В конце концов вам нужно будет дать определенные разрешения пользователю на определенный объект (форум, видео и т. д.).

Я ближе к ответу Юваля, все, что нам нужно, это связать объекты всего проекта + действия + пользователей. Чтобы обеспечить это; базовый объект (сущность) имеет смысл. Таким образом, любой объект, наследуемый от Entity, может быть легко связан с пользователем + действием.

Поскольку вы также хотите, чтобы все было просто; мое предложение было бы;

  • Любой объект из-за ограничений rbac должен быть производным от базовой сущности.
  • Должен быть список ролей, которые однозначно связаны с Сущностью.
  • Должен быть список отношений между пользователями и ролями.

Чтобы сделать еще один шаг вперед, я бы также рекомендовал следующее (для автоматизированного rbac):

  • Я использую сервисный доступ к своим объектам. Это; Я создаю репозитории объектов (которые делают для меня доступ к БД) и обращаюсь к репозиториям через сервисные функции.
  • Я использую настраиваемый атрибут в начале каждой сервисной функции. Это определяет требуемую роль для доступа к этой функции.
  • Я использую параметр User для доступа ко всем своим сервисным функциям, и каждая сервисная функция выполняет проверку роли перед своим выполнением. Отражение помогает мне понять, какую функцию я вызываю и какую роль она играет (через настраиваемые атрибуты).
  • Я также запускаю инициализатор при запуске моего приложения, и он проверяет все функции (и их атрибуты) и видит, добавил ли я новую требуемую роль. Если есть роль, которую я только что добавил, и ее нет в базе данных, она создает ее в базе данных.

Но, увы, это доступно только для .NET, насколько я знаю, у Java нет настраиваемых атрибутов, поэтому вряд ли это будет доступно для Java.

Я хотел бы придумать несколько примеров кода, но мне лень это делать. Тем не менее, если у вас есть вопросы о моем способе rbac; Вы можете спросить здесь, и я обязательно отвечу.

person detay    schedule 12.03.2010

Role Requirement очень хорошо работает с Restful Authentication, предоставляя функции аутентификации на основе ролей. поддерживается.

person Yardboy    schedule 12.10.2008
comment
веб-страница говорит, что она больше не поддерживается :-( - person Peter Kriens; 27.11.2012
comment
Да какая разница в несколько лет. :) Лично я использую Devise для аутентификации и комбинацию самостоятельного назначения ролей и CanCan для большинства моих потребностей в авторизации. Я начал идти по этому пути после просмотра Railscasts #192 (railscasts.com/episodes/192- авторизация-с-канканом). Я поклонник метода бинарной маскировки для хранения ролей пользователей. - person Yardboy; 27.11.2012

Попробуйте https://github.com/ThoughtWorksStudios/piece, это механизм правил для управления пользователями. управление доступом на основе ролей:

  1. Определить правила управления доступом
  2. Объединяйте правила для создания новых правил

Вы можете найти полный пример приложения Rails здесь: https://github.com/xli/piece-blog

person Xiao Li    schedule 05.09.2015

Для приложений .net вам следует взглянуть на что-то вроде Visual Guard http://www.visual-guard.com/ чтобы избежать необходимости обрабатывать разрешения и роли с нуля.

Также для .net у вас есть поставщики членства и ролей, а авторизация обрабатывается конфигурацией. http://www.odetocode.com/Articles/427.aspx

person Keith Patton    schedule 11.10.2008

Введение в RBAC —

Система управления доступом на основе ролей — это метод ограничения доступа к «некоторым источникам или приложениям или некоторым функциям приложений» на основе ролей пользователей организации.

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

И если мы немного углубимся в RBAC, он в основном содержит 3 функции.

1) Аутентификация — подтверждает личность пользователя. Обычно это делается с помощью учетных записей пользователей и паролей или учетных данных.

2) Авторизация — определяет, что пользователь может делать и что не может делать в приложении. Бывший. «Изменение заказа» разрешено, но «создание нового заказа» не разрешено.

3) Аудит действий пользователя в приложениях. - Он отслеживает действия пользователя в приложениях, а также то, кто каким пользователям предоставил какой доступ?

Это был очень простой вид системы RBAC сверху.

Базовая структура системы RBAC может содержать следующие компоненты: пользователи, роли, разрешения или ограничения, ресурсы.

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

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

person Kunal Khatri    schedule 03.08.2015

Мне очень нравится этот пост в блоге: https://content.pivotal.io/blog/access-control-permissions-in-rails

РЕДАКТИРОВАТЬ:

Похоже, что ryanb из railscasts думал в том же направлении и создал гем под названием cancan https://github.com/ryanb/cancan, используя базовую технику, похожую на сообщение pivotollabs.

person bluekeys    schedule 21.12.2009