Разрешения для пользователей веб-сайта

Я работаю над веб-сайтом, где каждый пользователь может иметь несколько ролей / разрешений, таких как базовый вход в систему, заказ продуктов, администрирование других пользователей и т. Д. Кроме того, существуют магазины, и каждый магазин может иметь несколько пользователей, управляющих им. У каждого магазина также есть собственный набор разрешений.

Я запутался и не уверен, как лучше представить это в БД. Прямо сейчас думаю:

роли пользователей users_roles store store_users

Но должны ли мне также иметь таблицы store_roles и store_users_roles для отслеживания отдельных разрешений для магазинов или мне следует ограничить роли одной таблицей «ролей»?

Первоначально я думал о наличии только одной таблицы ролей, но как насчет пользователей, которые имеют роли в нескольких магазинах? То есть, если пользователю дается роль, скажем, «обновление продукта в магазине», потребуется какой-то метод определения того, к какому магазину это относится. Таблица store_users_roles может исправить это, имея поле store_id, таким образом, пользователь может иметь «обновление продукта в магазине» и «удаление продукта в магазине» для магазина № 42 и только «обновление продукта в магазине» для магазина № 84.

Надеюсь, я здесь понимаю.

Редактировать

Спасибо за информацию всем. Видимо у меня есть над чем подумать. Это просто забавный проект, над которым я работаю, но RBAC всегда был чем-то, что я хотел лучше понять.


person Anti-Dentite    schedule 20.02.2009    source источник
comment
Какой язык / платформу вы используете?   -  person GEOCHET    schedule 20.02.2009
comment
в любом случае, какое значение имеет язык? это просто концептуальная проблема отношений   -  person Pita.O    schedule 21.02.2009


Ответы (4)


Возможно, сейчас это очевидно, но контроль доступа на основе ролей - это жесткий. Я предлагаю не пытаться писать свои собственные, если только вы не хотите, чтобы эта часть занимала все время, которое вы надеялись потратить на «крутые вещи».

Существует множество гибких, тщательно протестированных библиотек авторизации, реализующих RBAC (иногда ошибочно обозначаемых как ACL), и я предлагаю найти ту, которая соответствует вашим потребностям, и использовать ее. Не изобретайте велосипед, если вы не фанат колеса.

person Jens Roland    schedule 20.02.2009

Мне кажется вероятным, что если бы у меня было разрешение на выполнение определенных ролей в наборе магазинов, то у меня, вероятно, были бы одинаковые разрешения в каждом магазине. Так что одной таблицы ролей, вероятно, будет достаточно. Таким образом, «Джо» может выполнять «обновление продукта в магазине» и «удаление продукта из магазина», а затем иметь таблицу user_stores, чтобы перечислить, к каким магазинам у него есть доступ. Предполагается, что для всего этого списка у него будут одинаковые разрешения во всех магазинах.

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

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

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

person MikeW    schedule 20.02.2009

Ваша модель мне нравится. Единственное изменение, которое, как мне кажется, вам нужно, касается детализации роли. Прямо сейчас ваша роль - всего лишь операция.

Но сначала вам понадобится таблица store_role, объединенная таблица, разрешающая отношение «многие ко многим», ч / б роль и хранилище. т. е. у одного магазина может быть много ролей, и одна роль может выполняться во многих магазинах.

Например: StoreA может СОЗДАТЬ, ОБНОВИТЬ, УДАЛИТЬ клиента. и УДАЛИТЬ клиента можно в StoreA, StoreB и StoreC.

Затем вы можете свободно связывать пользователей с store_role_id в таблице user_store_roles.

Теперь запись user_store_role будет иметь user_id и store_role_id:

Коллекция

ВЫБРАТЬ * ИЗ РОЛЯ_ПОЛЬЗОВАТЕЛЯ, ГДЕ user_id = @userID

возвращает все разрешенные операции пользователя во всех магазинах.

Для набора ролей пользователей в конкретном магазине выполните внутреннее соединение вышеуказанного с таблицей user_store, добавив часть WHERE подобного

где STORE_ROLE.store_id = @storeID

person Pita.O    schedule 20.02.2009

Поместите store_id в user_roles таблицу.

Если это Rails, модель пользователя have_many :stores, :through => :roles

person Sarah Mei    schedule 20.02.2009