DDD и объекты, зависящие от авторизации, как совокупные корни?

#security #domain-driven-design #authorization #aggregateroot

#Безопасность #дизайн, управляемый доменом #авторизация #aggregateroot

Вопрос:

Интересно, должен ли я моделировать зависимые объекты как совокупные корни. Допустим, у меня есть a TaskList , а в этом списке есть Task s. A Task не может существовать без a TaskList , но его можно просматривать и редактировать отдельно. Я думаю, что нет особых условий, которые TaskList можно было бы проверять при изменении или добавлении задачи, что было бы основной причиной для совокупного корня. Единственным условием является то, что объект TaskList и его задачи могут редактироваться только владельцем. Было бы легко обеспечить это условие, если TaskList бы у него был владелец, и задачи можно было редактировать только через список задач. В противном случае мне нужно было бы быстро определить владельца или добавить поле владельца в задачи.

Итак, что здесь уместно?

  • Задача и список задач как совокупные корни, так и каждый с полем владельца
  • Только список задач как совокупный корень и задачи как зависимые объекты

Я пропустил что-то важное?

Ответ №1:

  • Если нет инвариантов, управляющих обоими, создайте их как отдельные агрегаты.
  • Список задач является фабрикой задач, что позволяет ему указывать задаче, кто является владельцем задачи. Любое последующее поведение задачи теперь может проверять, что они выполняются надлежащим владельцем (т. Е. Задача должна помнить, что список сообщил владельцу). Тем не менее, это кажется плохим дизайном с точки зрения UX. Зачем включать кнопку редактирования (или отображать детали как доступные для редактирования) для задач, владельцем которых пользователь не является? Да, возможна атака «человек посередине». Но сколько времени / денег вы готовы потратить на это (насколько это важно)?
  • Что касается авторизации, спросите, насколько это часть вашей модели. Не говорю, что это не так или есть, просто есть о чем подумать.
  • Подробнее о дизайне агрегата можно найти здесь: Эффективный дизайн агрегата и повышение производительности и масштабируемости с помощью DDD

Комментарии:

1. Где вы видите возможность для атаки «человек посередине»?

2. Что-нибудь между вашим пользовательским интерфейсом и частью, которая выполняет поведение в задаче.

Ответ №2:

Я бы сделал это так:

 class TaskList{
 User Owner;
 Task[] Tasks;
}

class Task{
 TaskList List; string Description;
 void ChangeDescription(description){
  if(List.Owner!=CurrentUser)
   throw exception or whatever;
  else
   Description=description;
 }
}

// http post
class TaskController{
 ActionResult ChangeDescription(int id, string description){
  _tasks.Find(id).ChangeDescription(description);
 }
}