Для правильной работы я обнаружил, что уровни доступа должны быть в этом возрастающем порядке:
НЕТ, ПРОСМОТР, ТРЕБУЕТСЯ, РЕДАКТИРОВАТЬ.
Обратите внимание, что REQUIRED НЕ является верхним уровнем, как вы думаете, так как EDIT (разрешение на заполнение и удаление) является большей привилегией, чем REQUIRED (разрешение только на заполнение).
Перечисление будет выглядеть так:
/** NO permissions.
* Presentation: "hidden"
* Database: "no access"
*/
NONE(0),
/** VIEW permissions.
* Presentation: "read-only"
* Database: "read access"
*/
VIEW(1),
/** VIEW and POPULATE permissions.
* Presentation: "required/highlighted"
* Database: "non-null"
*/
REQUIRED(2),
/** VIEW, POPULATE, and DEPOPULATE permissions.
* Presentation: "editable"
* Database: "nullable"
*/
EDIT(3);
На нижнем уровне (ограничения базы данных) создайте карту полей для доступа. Затем эта карта обновляется (дополнительно ограничивается) при следующем повышении уровня (бизнес-правила + пользовательские разрешения). Наконец, верхний слой (правила представления) может при необходимости снова ограничить карту.
Внимание! Карту необходимо обернуть так, чтобы при любом последующем обновлении доступ был только уменьшен . Обновления, которые пытаются увеличить доступ, следует просто игнорировать, не вызывая ошибок. Это потому, что он должен действовать как система голосования на то, как должен выглядеть доступ. По сути, последующее разбиение уровней доступа, как упомянуто выше, может происходить в любом порядке, так как это приведет к тому, что после каждого уровня проголосуют все уровни доступа для каждого поля.
Ветви:
1) Уровень представления МОЖЕТ скрыть поле (установить доступ к NONE) для указанного в базе данных поля только для чтения (VIEW).
2) Уровень представления НЕ МОЖЕТ отображать поле, когда бизнес-правила говорят, что пользователь не имеет по крайней мере доступа VIEW.
3) Уровень представления НЕ МОЖЕТ переместить доступ поля к «редактируемому» (обнуляемому), если база данных говорит, что это только «требуется» (не обнуляемому).
Примечание: должен быть создан слой представления (пользовательские теги отображения) для визуализации полей путем чтения карты доступа без необходимости каких-либо утверждений "если".
Та же карта доступа, которая используется для настройки дисплея, также может использоваться при проверке отправки. Общий валидатор может быть написан для чтения любой формы и ее карты доступа, чтобы обеспечить соблюдение всех правил.
(см. Также ветку: Рекомендации по управлению доступом к полям формы )