Эта проблема не нова; это в основном общая проблема авторизации и прав доступа / контроля.
Чтобы избежать необходимости моделировать и поддерживать полный график того, какие объекты каждый пользователь может получить доступ к каждому возможному способу, вы должны принять решение (на основе того, что делает ваше приложение) о том, как начать царствовать в мультипликативной шкале факторы. Итак, во-первых: где пользователи получают свои права? Если каждому пользователю назначены индивидуальные права, вы столкнетесь с серьезной трудоемкой задачей управления для тех, кто должен добавлять пользователей, изменять пользователей и т. Д.
Возможно, пользователи могут получить свои права в группах, членами которых они являются. Теперь у вас есть коэффициент масштабирования, который упрощает управление и облегчает понимание системы. Изменение группы изменяет действующие права для всех пользователей, которые являются членами.
Теперь, как эти права выглядят? Вероятно, по-прежнему нецелесообразно назначать права на целевой объект по объектам. Таким образом, возможно, права следует рассматривать как набор абстрактных «карт доступа». Объекты в системе могут быть помечены как требующие «синего» доступа для чтения, «красного» доступа для обновления и «черного» доступа для удаления. Эти абстрактные права могут быть расположены в некоторой топологии, такой, что наличие «черного» доступа означает, что у вас неявно также есть «красный» и «синий», или, может быть, они все не связаны; Вам решать, как ваше приложение должно работать. (Также обратите внимание, что вам может потребоваться учитывать, что для типов объектов & mdash; таблицы, если вам нравится & mdash; могут понадобиться свои собственные правила доступа, по крайней мере, для "create".
Вводя точки сбора в графические изображения, которые вы рисуете, связывая акторов в системе с объектами, на которые они воздействуют, вы можете решать проблемы масштабирования и контролировать сложность авторизации. Однако это никогда не бывает легким, и часто бывает так, что озвученные желания клиентов приводят к тому, что никогда не получится и фактически не достигнет того, что клиент (думает, что он) хочет.
Язык реализации не имеет ничего общего с архитектурными решениями, которые вам нужно принять.