Как лучше всего реализовать подобную архитектуру?
Роли - это множества (точнее - "деревья" множеств), содержащие пользователей.Расписываю подробно на примере:
Есть пользователь User1, у него роль Admin и роль Curator.
Т.е. он имеет в своём личном кабинете 2 пункта меню: Администрирование и Курирование.
Всё что в базе - привязывается только через ID-шник этого пользователя (роли и поля ролей, и т.п.).
Сейчас делаю проект с аналогичной структурой.
Путем проб и нескольких ошибок :) выяснил, что лучше всего делать так:
1. Все поля всех ролей сваливаются в одну таблицу (одинаковые поля не дублируются) и делаются nullable
а) либо в users (получается немного неряшливо);
б) либо в profiles (отношение 1к1 с users), просто чтобы отделить котлеты от мух.
2. В исходниках проверяются НЕ РОЛИ, а разрешения, причем на каждое свойство профиля (учеба, достижения) - свое разрешение.
Это позволит вам в любой момент добавить разрешение, например, на "достижения" в роль клиенту и у него появятся соответствующие элементы форм, вьюх и т.д.
Здесь тоже есть одна тонкость: если роль администратора позволяет ему редактировать чужие профили, то желательно показывать ему только те поля, которые разрешены конкретному пользователю (которого редактирует администратор). Это не является проблемой, если ваш модуль RBAC позволяет навешивать колбэки на проверку разрешений.
Вот модуль с колбэками собственного производства: h-rbac
И статья о нем: Laravel 5. Иерархический RBAC для самых маленьких