【发布时间】:2014-06-21 07:06:03
【问题描述】:
我阅读了有关 DDD 和访问控制的信息,发现以下两种观点之间存在一些矛盾:
- “安全问题应在域外处理”
- “访问控制要求是特定领域的”
我正在寻找关于此的最佳实践。那么领域驱动设计的访问控制逻辑应该放在哪里,应该如何实现呢?
(更具体的是 DDD + CQRS + ES。)
我认为它应该靠近业务逻辑,例如用户故事可能是这样的:
用户可以通过发送用户名、爱好列表、简历等来编辑他的个人资料...
根据用户故事,我们实现领域模型和服务,例如:
UserService
editProfile(EditUserProfileCommand command)
User user = userRepository.getOneById(command.id)
user.changeName(command.name)
user.changeHobbies(command.hobbies)
user.changeCV(command.cv)
UserRepository
User getOneById(id)
User
changeName(String name)
changeHobbies(String[] hobbies)
changeCV(String cv)
这没关系,但故事的 HIS profile 部分在哪里?
这显然是基于属性的访问控制,因为我们应该写这样的规则:
deny all, but if subject.id = resource.owner.id then grant access
但是我们应该在哪里执行这个规则,我们应该如何执行呢?
【问题讨论】:
-
在命令中包含用户 ID (
command.id) 会引起歧义。更好地从命令中删除用户 ID,并将从授权上下文中获取的用户与命令一起传递。 -
@Lightman 感谢您的意见。老实说,我不知道为什么这个问题和答案会得到这么高的分数。也许有人应该写一篇文章或示例应用程序来说明应该如何正确地做到这一点。最近又开始看DDD了,好文章真的好难找。其中一些存在明显的设计问题。我想这会发生在每个人都可以写一个主题的时候,即使是像我这样不完全理解的人。
标签: security domain-driven-design access-control