Я працюю над невеликим додатком, намагаючись зрозуміти принципи доменного дизайну. У разі успіху це може бути пілотним проектом для більшого проекту. Я намагаюся слідкувати за книгою "Впровадження дизайну, керованої доменом" (автор Вон Вернон) і намагаюся реалізувати подібний, простий дискусійний форум. Я також перевірив зразки IDDD на github. У мене є певні труднощі з прийняттям ідентичності та доступу до моєї справи. Дозвольте надати довідкову інформацію:
- Я (сподіваюсь) розумію міркування щодо розділення логіки користувачів та дозволів: це допоміжний домен, і це інший обмежений контекст.
- У основному домені немає користувачів, лише Автори, Модератори тощо. Вони створюються, звертаючись до контексту Identity та Access за допомогою сервісу, а потім переводячи отримані об’єкти Користувача до Модератора.
Операції з доменом викликаються пов'язаною роллю в якості параметра: наприклад:
ModeratePost( ..., moderator);
Метод об’єкта домену перевіряє, чи вказаний примірник Модератора не є нульовим (екземпляр Модератора буде нульовим, якщо користувач запитав з контексту Identity and Access не має ролі Модератора).
В одному випадку він робить додаткову перевірку перед зміною публікації:
if (forum.IsModeratedby(moderator))
Мої запитання:
В останньому випадку хіба проблеми безпеки знову не змішуються в основний домен? Раніше у книгах було зазначено, "з ким можна публікувати тему чи за яких умов це дозволено. Форуму просто потрібно знати, що автор робить це зараз".
Реалізація на основі ролей у книзі є досить простою: коли модератор є основним доменом, він намагається перетворити поточний користувальницький ідентифікатор в екземпляр Модератора або в автора, коли це потребує. Сервіс відповість відповідним екземпляром або нулем, якщо користувач не має необхідної ролі. Однак я не бачу, як я міг би адаптувати це до більш складної моделі безпеки; наш нинішній проект, над яким я пілотую, має досить складну модель з групами, ACL тощо.
Навіть із правилами, які не дуже складні, як-от: "Публікацію слід редагувати лише її власником чи редактором", такий підхід здається порушеним, або, принаймні, я не бачу правильного способу його виконання.
Запитуючи контекст Identity and Access для екземпляра OwnerOrEditor, це не так, і я закінчую все більшою кількістю класів, пов’язаних із безпекою в основній області. Крім того, мені потрібно було б передати не лише userId, а ідентифікатор захищеного ресурсу (ідентифікатор повідомлення, форуму тощо) до контексту безпеки, який, мабуть, не повинен перейматися цими речами (чи правильно це? )
Перетягнувши дозволи на основний домен і перевіривши їх у методах об’єктів домену або в службах, я б закінчився на квадратному: змішування проблем безпеки з доменом.
Я десь читав (і я з цим погоджуюся), що ці речі, пов'язані з дозволом, не повинні бути частиною основного домену, якщо тільки безпека та дозволи не є основним доменом. Чи виправдовує таке просте правило, як наведене вище, що робить безпеку частиною основного домену?
HasPermissionToEdit(userId, resourceId)
але я не вважаю правильним забруднювати логіку домену цими дзвінками. Ймовірно, я повинен перевірити їх у методах обслуговування додатків, перш ніж звертатися до логіки домену?
UserService @AccessControlList[inf3rno]
у відповіді, до якої я пов’язаний.