Я реализующий RESTful сервис, который имеет модель безопасности, требующую авторизации на трех уровнях:Обеспечение авторизации propertly уровня в домене объекты
- ресурсы авторизации Уровень - определения того, имеет ли пользователь доступа к ресурсу (сущность). Например, имеет ли текущий пользователь разрешение на просмотр клиентов в целом. Если нет, , тогда все останавливается.
- Регистрация уровня экземпляра - определение того, имеет ли пользователь доступ к определенному экземпляру ресурса (объекта). Из-за различных правил и состояния объекта, текущий пользователь может не получить доступ к одному из клиентов в пределах набора клиентов. Например, клиент может просматривать свою информацию, но не информацию другого клиента.
- Права собственности - определить, какие свойства у пользователя есть доступ к экземпляру ресурса (объекта). У нас есть много бизнес-правил , которые определяют, может ли пользователь видеть и/или изменять отдельные свойства ресурса (объекта). Например, текущий пользователь может видеть имя клиента, но не свой адрес или номер телефона , а также возможность просмотра и добавления заметок.
Внедрение разрешения на уровне ресурса прямолинейно; однако, другие два не являются. Я полагаю, что решение для авторизации на уровне экземпляра покажет себя с решением (более жестким, imo) вопросом авторизации на уровне собственности. Последняя проблема осложняется тем фактом, что мне нужно передать решения авторизации по свойству в ответном сообщении (ala hypermedia) - другими словами, это не то, что я могу просто обеспечить в установщиках свойств.
С каждым запросом к службе я должен использовать текущую информацию пользователя для выполнения этих проверок авторизации. В случае запроса GET для списка ресурсов или отдельного ресурса мне нужно указать уровень API, который атрибуты текущего пользователя могут видеть (видимо), и доступен ли атрибут только для чтения или редактируется. Затем слой API будет использовать эту информацию для создания соответствующего ответного сообщения. Например, любое свойство, которое не отображается, не будет включено в сообщение. Свойства только для чтения будут помечены так, чтобы клиентское приложение могло отобразить свойство в соответствующем состоянии для пользователя.
Решения, такие как службы приложений, аспекты и т. Д., Отлично подходят для авторизации на уровне ресурсов и могут даже использоваться для проверок на уровне экземпляра, но я задерживаю определение того, как лучше всего смоделировать мой домен, чтобы бизнес-правила и проверки обеспечивали соблюдение ограничения безопасности.
ПРИМЕЧАНИЕ. Имейте в виду, что это выходит за рамки безопасности на основе ролей, поскольку я получаю окончательный результат авторизации на основе бизнес-правил, используя текущее состояние ресурса и среды (наряду с проверкой доступа с использованием разрешений, предоставленных текущий пользователь через их роли).
Как я должен моделировать домен, поэтому у меня есть применение всех трех типов проверок авторизации (проверяемым способом, с DI и т. Д.)?
Правила авторизации на самом деле не принадлежат к домену, если только это не выражено в терминах домена. Например. 'деактивировать (менеджер менеджера)'. Кроме того, DDD - это все о реальном поведении, а не CRUD. Если у вас есть сеттеры для каждой отдельной проблемы, то DDD является неправильным решением для вашего домена или вы неправильно настроили свой домен. Поэтому вместо того, чтобы смотреть на защиту данных на уровне собственности для записей, вы должны изучать защиту бизнес-операций. – plalx
Я согласен с вами в том, что наши объекты домена должны быть изменены только с помощью методов. Мой вопрос фактически имеет меньше общего с изменением объекта и более того, как использовать правила для создания соответствующего представления объекта. – SonOfPirate
Например, если текущему пользователю не разрешено просматривать определенные свойства объекта, основываясь не только на его разрешениях, но и на бизнес-правилах, которые определяют поведение объекта. Мне нужно динамически применять эти правила в сочетании с разрешениями пользователя, чтобы определить текущее состояние объекта не только на уровне сущности, но и на уровне свойства/атрибута. – SonOfPirate