Основная сделка заключается в том, что у нас есть специальный «кикстарт» для наших проектов. Для этого мы переделываем пользовательский элемент управления. Я знаю, что есть много вопросов об общем rbac, но я не могу найти ни одного по иерархическому rbac?
Наши требования:
- Роли могут быть назначены групповым разрешениям
- Если роль не имеет записи о разрешении, она автоматически отклоняется.
- Пользователю могут быть предоставлены преимущественные права
- Пользователи, переопределяющие разрешения, либо предоставляют, либо запрещают
- Если пользователю явным образом отказано в разрешении, независимо от того, какие роли говорят «предоставлено», преобладает переопределение.
- Пользователи могут иметь несколько ролей
- Роли могут иметь иерархию
- Роли могут наследоваться от других ролей (например, роль «Супермодератор форума» - это «Модератор форума» и «Сопровождение системы», а роль «Модератор форума» уже наследуется от роли «Пользователь форума»)
- Роли, которые наследуются от другой роли, которая запрещает или предоставляет привилегию, переопределяют их дочернее разрешение
- Разрешения сгруппированы по «модулю» (например, модуль «Блог» может иметь разрешение «редактировать запись», а модуль «Форум» может иметь разрешение «редактировать запись», и они не будут конфликтовать)
- Существует разрешение «Все и все», которое автоматически предоставляет полный доступ.
Итак, с учетом этих требований, вот как я собираюсь это сделать.
Таблица: Пользователи
id | int | unique id
Таблица: Роли
id | int | unique id
--------------|---------------------------------------------
title | varchar | human readable name
Таблица: Разрешения
id | int | unique id
--------------|---------------------------------------------
module | varchar | module name
--------------|---------------------------------------------
title | varchar | human readable name
--------------|---------------------------------------------
key | varchar | key name used in functions
Таблица: Role_User
role_id | int | id from roles table
--------------|---------------------------------------------
user_id | int | id from users table
Таблица: Permission_Role
id | int | unique id
--------------|---------------------------------------------
permission_id | int | id from permissions table
--------------|---------------------------------------------
role_id | int | id from roles table
--------------|---------------------------------------------
grant | tinyint | 0 = deny, 1 = grant
Таблица: Permission_User
id | int | unique id
--------------|---------------------------------------------
permission_id | int | id from permissions table
--------------|---------------------------------------------
user_id | int | id from users table
--------------|---------------------------------------------
grant | tinyint | 0 = deny, 1 = grant
Ну, на самом деле это половина, в этой части я уверен, часть, на которой я застреваю, - это иерархические роли.
Итак, как мне это спроектировать? Моя идея состоит в том, чтобы сэкономить на запросах к базе данных, я просто собираюсь построить матрицу разрешений при входе в систему и сохранить ее в сеансе, чтобы запросы не были слишком простыми, поскольку они выполняются только один раз для каждого входа в систему.
Проблема, которую я вижу, заключается в том, что мне нужно знать иерархию ролей, чтобы я мог разрешить разрешения унаследованных ролей, прежде чем разрешить наследование.
Разрешения пользователей - это простая часть, разрешения для пользователей - это, по сути, окончательно решенная группа.
user
нетrole
, но естьpermission
? Это образец разрешения, а не образец для подражания, не так ли? При таком подходе роли нигде не используются. - person BlitZ   schedule 22.04.2013user
иметьpermission
. В нем могут бытьrole
сpermission
, но неpermission
, как они есть. Эта штука портит логику (ИМХО). - person BlitZ   schedule 22.04.2013