Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security DDD和授权相关对象作为聚合根?_Security_Domain Driven Design_Authorization_Aggregateroot - Fatal编程技术网

Security DDD和授权相关对象作为聚合根?

Security DDD和授权相关对象作为聚合根?,security,domain-driven-design,authorization,aggregateroot,Security,Domain Driven Design,Authorization,Aggregateroot,我想知道是否应该将依赖对象建模为聚合根。假设我有一个任务列表,这个列表有任务s。如果没有任务列表,任务就不能存在,但可以单独查看和编辑。在修改或添加任务时,任务列表不会检查任何特殊条件,我认为这是聚合根的主要原因。唯一的条件是,任务列表及其任务只能由所有者编辑。如果任务列表有所有者,并且只能通过任务列表编辑任务,则很容易确保这种情况。否则,我将需要跨活动地检测所有者或向任务添加所有者字段 那么什么才是合适的呢 任务和任务列表都作为聚合根,并且每个根都有一个所有者字段 仅将任务列表作为聚合根,并

我想知道是否应该将依赖对象建模为聚合根。假设我有一个
任务列表
,这个列表有
任务
s。如果没有任务列表,
任务
就不能存在,但可以单独查看和编辑。在修改或添加任务时,
任务列表
不会检查任何特殊条件,我认为这是聚合根的主要原因。唯一的条件是,
任务列表及其任务只能由所有者编辑。如果
任务列表
有所有者,并且只能通过任务列表编辑任务,则很容易确保这种情况。否则,我将需要跨活动地检测所有者或向任务添加所有者字段

那么什么才是合适的呢

  • 任务和任务列表都作为聚合根,并且每个根都有一个所有者字段
  • 仅将任务列表作为聚合根,并将任务作为从属实体
我错过了什么重要的东西吗?

  • 如果两者都没有不变量,则将它们设计为单独的聚合
  • 任务列表是任务的工厂,因此允许它告诉任务谁是任务的所有者。现在,任务的任何后续行为都可以验证它们是由适当的所有者执行的(即,任务应该记住列表告诉所有者的内容)。然而,从用户体验的角度来看,这似乎是糟糕的设计。为什么要对用户不是其所有者的任务启用“编辑”按钮(或将详细信息显示为可编辑)?是的,中间人的攻击是可能的。但你愿意在这方面花费多少时间/金钱(有多重要)
  • 至于授权,一定要问这在你的模型中占多大比例。不是说它不是或是,只是想一想
  • 有关聚合设计的更多信息,请参见: &

    • 我会这样做:

      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);
       }
      }
      

      你在哪里看到中间人攻击的可能性?UI和执行任务行为的部分之间的任何东西。