我正在尝试弄清楚如何将安全性应用于我的 ddd 场景。
作为示例,我们采用 Vernon 书中的
moderatePost
方法。
规则是只有论坛版主才能审核此论坛中的帖子:
public void moderatePost(
Post aPost,
Moderator aModerator,
String aSubject,
String aBodyText) {
this.assertStateFalse(this.isClosed(), "Forum is closed.");
this.assertArgumentNotNull(aPost, "Post may not be null.");
this.assertArgumentEquals(aPost.forumId(), this.forumId(), "Not a post of this forum.");
this.assertArgumentTrue(this.isModeratedBy(aModerator), "Not the moderator of this forum.");
aPost.alterPostContent(aSubject, aBodyText);
}
在某些应用程序中,管理员(超级用户)有权执行系统中的每个操作。如何将“超级用户”添加到此类建模域?我能想到的唯一解决方案是添加绕过
moderatePost
断言的重载 isModeratedBy
方法,但在这种情况下,很容易想象有人会在应用程序层使用此类方法而不是现有方法。
不要改变或超载适度的帖子。
只需从 IAM 上下文中为您的超级用户授予主持人权限以及所有权限即可。听起来很麻烦,但它不会让你改变你的产品代码,使审计更简单(你可以跟踪哪个用户拥有哪个角色),没有神奇的超级用户。
假设 IAM 发送一个新事件 UserAssignedToRole (SuperUser),在您的协作上下文中,您将像在 https://github.com/VaughnVernon/IDDD_Samples/blob/master/iddd_agilepm/src/main 中那样监听此事件/java/com/saasovation/agilepm/port/adapter/messaging/rabbitmq/RabbitMQTeamMemberEnablerListener.java
另一种选择是将超级用户添加为域的一部分,就像为主持人和作者所做的那样,断言将变成这样:
this.assertArgumentTrue(this.isModeeratedBy(aModerator) || this.isSuperUser(aModerator), "不是本论坛的版主。");