在 Clean Architecture 中从哪里获取权限数据?

Where to fetch data for permissions in Clean Architecture?

提问人:Symonen 提问时间:11/8/2023 更新时间:11/20/2023 访问量:33

问:

使用干净的架构,我需要实现权限。

我决定实现额外的权限层 PermissionsChecker。 我的权限取决于数据库状态。我已将权限分配给数据库中的用户,这取决于域对象的状态。 我有数据库适配器。现在我应该使用该适配器在哪里获取数据?

  1. 我是否应该在用例级别获取数据并将其传递给 PermissionChecker?
  2. 或者我应该在权限层上获取数据?但是,PermissionChecker 将依赖于数据库端口。
  3. 还是其他我没有想到的解决方案?
设计模式 架构 干净架构

评论

1赞 plainionist 11/9/2023
如果不更多地了解您的设计,就很难给出建议。也许您可以在您的问题中添加一些代码片段或图表?
0赞 R.Abbasi 11/11/2023
它比角色管理更复杂吗?我不明白你如何授权操作。使用角色管理系统时,最好对 API 进行授权,而不是将授权泄露给其他层。如果您有任何复杂的规则需要获取聚合/实体(不是用户聚合/实体,我的意思是像产品聚合/实体一样),您应该在域模型中执行此操作。

答:

0赞 hatem87 11/20/2023 #1

正确答案取决于您的实际需求。 这取决于您面临的权限问题是数据访问问题还是功能访问问题。

虽然我认为这是一个功能访问问题,但我认为正如评论中提到的,将权限管理与数据库混合使用并不是一个好主意。 数据库只是一个存储工具,保持其角色尽可能简单。 在数据库或数据访问层中执行此操作将使您的设计成为一场噩梦。 在这种情况下,您会发现自己传入了用户标识并遍历了所有层,直到找到数据库。

如果您的项目分为 3 层:应用程序层(Web API、soap 等端点)、域层(业务层)、基础设施层。 就我个人而言,我认为权限管理是应用层的一部分。 或者它可以是另一层:应用层和域层之间的授权层。

这允许您在权限约束更改时保持域图层不可触及。 好的设计目标之一就是减少依赖关系对领域层的影响,而权限管理是一种依赖关系。

这也允许您测试/验证域层,而不管用户权限问题如何。

面向功能的设计可能对您的案例有用。

如果问题出在数据访问问题上,则意味着允许所有功能,但数据边界因用户而异,在这种情况下,我认为实现起来会更复杂。