Допустим, у меня есть такие требования:
Пользователь A в роли AA должен иметь возможность обновлять все объекты типа A1.
Пользователь B в роли BB должен иметь возможность обновлять только объекты типа A1 с первичным идентификатором "2", который я назову A1 ("2"), и не может обновлять любые другие объекты типа A1, но может добавить или удалить любое количество дочерних объектов типа B2 к объекту A1 («2»).
Пользователь C в Role CC должен иметь возможность редактировать большинство, но не все свойства этих дочерних объектов B2, принадлежащих объекту A1 ("2"), а также члены Role CC не могут добавлять или удалять объекты B2 из A1 ( "2").
Пользователь D находится в Role BB и Role CC, и в результате комбинированного членства имеет разрешения, полученные из объединения двух наборов разрешений (в данном случае, поскольку разрешения Role CC являются надлежащим подмножеством роли BB, это означает, что пользователь D может делать все, что разрешено для роли BB).
И так далее. Эти политики могут быть изменены после развертывания, и поэтому не должны требовать значительных усилий по переработке для реализации изменений (например, что может потребоваться для декларативного подхода к решению этой проблемы).
Я бы предположил, что списки контроля доступа (ACL) будут храниться рядом или внутри защищаемых объектов.
Я предполагаю, что разработчик, пишущий код, должен иметь возможность императивно (не декларативно) запрашивать единственный метод / функцию / операцию / процедуру, с аргументами, идентифицирующими текущий принципал, рассматриваемый объект, рассматриваемую операцию (возможно) мы называем это привилегией), а затем получаем единственное логическое значение, указывающее, должна ли операция быть разрешена или запрещена.
Не стесняйтесь оспаривать мои предположения.
Теперь я уже имею в виду простое, но эффективное запатентованное общее решение (основанное на работе, которую я уже посвятил производству и работает довольно хорошо). Я рассматриваю возможность публикации этого проекта с открытым исходным кодом.
Но прежде чем перейти к следующему уровню и создать эту версию, я подумал, знает ли кто-нибудь о широко распространенной системе, модуле или библиотеке (не обязательно должен быть .NET), которая уже помогает разработчикам в реализации этот вид детального контроля над сущностями (будь то записи в базе данных или объекты в ORM или что-либо еще).
P.W. Просматривая ответы перед публикацией этого сообщения в SO, я нашел ответ в другом месте ( SO LINK ), в котором предполагалось, что Zend_Acl может иметь такую возможность для проекта LAMP, но я бы предпочел решение .NET / Windows вместо этого.