Если я правильно понимаю, у вас будет набор пользователей (возможно, подразделенный на подмножества: каждое подмножество является группой).
Также:
- Пользовательвсегда является частью хотя бы одной группы
- Группа может быть частью другой группы
- Фактические списки ACL устанавливаются на уровне группы и определяются для каждой формы или таблицы.
Итак:
Item Type GroupId C R U D
Form001 F ALL_USERS N Y N N
Form001 F Sales N R U N
Form002 F Admin N Y Y Y
All_FORMS T:F Admin Y Y Y Y
Tab-045A D Sales Y Y Y Y
В котором говорится: Form001 - это (F) форма, и каждый может ее прочитать (но не изменять ее структуру).Пользователи из группы SALES также могут использовать форму 1 для обновления.Администраторы (группа) могут изменять, удалять или использовать форму Form002 (но не создавать ее ...). Администраторы могут создавать новые формы.Tab-045A - это таблица, записи которой могут быть созданы / использованы / изменены / удалены пользователями из группы Sales.
Несколько предостережений:
- Пожалуйста, сделайте всем одолжение ине разрешайте устанавливать привилегии на уровне ОДНОГО ПОЛЬЗОВАТЕЛЯ, но всегда только на уровне группы.Новый пользователь автоматически становится частью ALL_USERS и может быть позже добавлен (или удален) из других групп.
- Вероятно, лучше иметь не только таблицы и формы, но и "группы форм" (при условии, чтоформы могут быть созданы конечными пользователями).Если это не так, то поле «C» в наборе флагов CRUD становится бесполезным для форм.(Являются ли формы чем-то, что группа пользователей может спроектировать? Или они являются частью приложения, как, я полагаю, было бы в случае с таблицами?).
- В общем случае вы должны определить подходящую семантику для Create / Read/ Update / Delete.Для таблиц я предполагаю, что это означает СОЗДАНИЕ ОДНОЙ ЗАПИСИ (не таблицы), но для форм это немного запутано в данный момент.
- Приведенная выше таблица является лишь примером и не нормализована должным образом.В зависимости от специфики вам, возможно, придется разделить его по крайней мере на две таблицы, а возможно и больше.
- Чтобы выяснить, может ли пользователь X выполнить операцию Y на объекте Z, вам, в основном, нужно найти набор разрешений для элемента./ Таблица групп и посмотреть, в какие группы входит пользователь X.
- Необходимо правильно управлять случаями, когда пользователь входит в две отдельные группы, и всегда выбирать ту, которая имеет большинство разрешений, или объединение всехразрешения.
- Вы должны управлять случаями, когда пользователь является частью группы, которая является подгруппой другой группы, и привилегии были определены в группе более высокого уровня.
Управляя группами и подгруппами, вы лучше посмотрите, какие средства существуют в вашей целевой БД для управления древовидными структурами.И вам лучше освежить тему, взглянув на несколько вопросов об этом.Вот один из них, который поможет вам начать, но он не единственный:
Как сохранить дерево в базе данных SQL