Я делал нечто подобное, когда создавал CMS ...
По сути, я создал несколько таблиц в БД:
пользователей
Роли
UsersInRoles
Объекты
ObjectPermissions
Хорошо, это работает примерно так ...
Первые 3 довольно понятны, пользователи, роли и связи между ними.
Пользователю предоставляются разрешения в зависимости от его членства в ролях.
Следующее, что я делаю, это определяю «объекты», которым я хочу управлять разрешениями и уровнями разрешений, которым я хочу их назначить ...
Таким образом, объекты содержат список определений объектов, которые затем расширяются в других таблицах, связанных идентификатором объекта, и таблица ObjectPermissions в основном связывает объект с ролью.
Теперь, возможно, стоит объяснить кое-что о ролях ...
Роль, как я понимаю, это список разрешений, не более и не менее.
Итак, если я создаю роль с именем guest и устанавливаю роль разрешения на чтение, то создаю роль с именем admin, у которой есть глобальные права делать все, что я могу, затем сделать что-то вроде этого ...
Добавить пользователя 1 роль администратора.
Добавить объект 1 в роль администратора.
Пользователь 1 теперь будет иметь полный доступ к объекту 1, и здесь важно то, что разрешения наследуются, поэтому любые дочерние объекты (например, разрешения для файлов и папок) также будут иметь одинаковый набор ролей, если не будут рекурсивно переопределены.
поэтому по умолчанию я назначаю объект корневого уровня каждой ключевой системной роли.
Затем я выборочно добавляю пользователей к различным ролям в разных точках дерева.
Имеет ли это смысл?
По сути, я могу выбрать любой объект и любого пользователя и предоставить разную степень разрешений пользователю для этого объекта и его дочерних элементов, добавив пользователя к той же роли, что и для объекта.
Теперь нужно кое-что отметить по этому поводу ...
Если бы я хотел, чтобы у пользователя были права администратора для глубоко вложенного объекта, но не на корневом уровне, мне пришлось бы создать новую роль, которая предоставляет все разрешения, и добавить к ней как пользователя, так и объект.
Причина в том, что если бы я добавил пользователя в основную роль администратора, ему бы были предоставлены эти права от корневого уровня, а не от моего вложенного объекта.
это больше, чем это, но, по сути, именно так работают разрешения файловой системы.