Организация уровней доступа пользователей

Разработаваю сервис по доставке еды, сервис работает в разных городах, с разными ресторанами.

Есть следующая структура

Таблицы

Есть следующие типы пользователей

  • Администратор

  • Супервайзер

  • Принципал

  • Оператор

  • Клиент

Есть админка реализованная как модуль, в ней соответсвенно контроллеры и тд.

Необходимо разделить права, на редактирование некоторых функций, просмотр и тд.

Администратор может всё (добавлять города, кухни, пользователй любого типа)

Супервайзер может всё по городу.

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

Оператор может работать с заказами по городу (может обрабатывать заказы).

Клинет доступа в админку вообще не имеет, и просто пользуется сервисом (создаёт заказы).

Посоветуйте по огранизации уровней доступа? Куда смотреть? в сторону RBAC ?

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

Буду рад всем советам. ;)

Естественно, RBAC :)

Создадите 5 ролей, задачи и операции, а потом в нужных местах достаточно будет вставить checkAccess(). Элементы авторизации лучше хранить в бд, а в админке сделать возможность присвоить тому или иному пользователю некоторую роль с соответствующими правами.

Можно воспользоваться готовым расширением (вроде как неплохим): http://www.yiiframework.com/extension/srbac/

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

to Karasko

Да, тут конечно только RBAC.

Единственное замечание в схеме БД. Они не очень готова к дальнейшему масштабированию. Если вдруг потом будут добавляться новые сущности, будет "пухнуть" таблица profiles. Если, масштабирование нужно, то стиот завести таблицу, которая будет глобально раздавать идентификаторы сущностями. В таком случае в profile держать FK вообще будет не нужно. Но при этом необходимо завести таблицу в которую будет помещаться id пользователя и id сущности в соотношении 1:M. Если дальнейшее расширение схемы не требуется, то можно оставить все как есть.

Ммм. Спасибо всем гуру. Наконец-то чуток разобрался с RBAC, не так уж сложно.

2 creocoder

Вы примерно про это говорили

А уж entity_id связан может быть либо с городом, кухней, товаром и тд.

Или я не так понял, и усложнил что то ?

Спасибо :rolleyes:

to Karasko

Да, это оно. Правда остался ещё один мелкий момент. У вас таблица пользователи и таблица профили сейчас судя по ERD связана в соотношении 1:M. Мне кажется что вы на самом деле хотели бы 1:1 ;). Поэтому можно смело убирать поле user_id из таблица профилей, а id делать одновременно FK и PK, убрав AUTOINCREMENT (если он есть). Ведь по логике 1 пользователь = 1 профиль.

ERD = entity-relationship diagram ?

Ну да, вы правы, на самом деле 1 пользователь 1 профиль. Я просто привык почти во всех таблицах делай первым полем id autoincrement PK. Здесь лучше его самому назначать.

В точку.

Что касается привычек, то это дело естественное, но в разработке порой уводит от основ.