DDD 中的超级用户实现

问题描述 投票:0回答:1

我正在尝试弄清楚如何将安全性应用于我的 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
 方法,但在这种情况下,很容易想象有人会在应用程序层使用此类方法而不是现有方法。

architecture domain-driven-design
1个回答
1
投票

不要改变或超载适度的帖子。

只需从 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), "不是本论坛的版主。");

© www.soinside.com 2019 - 2024. All rights reserved.