gpt4 book ai didi

security - 领域驱动设计中的访问控制

转载 作者:行者123 更新时间:2023-12-03 06:06:06 28 4
gpt4 key购买 nike

我阅读了有关 DDD 和访问控制的内容,发现以下两种观点之间存在一些矛盾:

  • “安全问题应该在域外处理”
  • “访问控制要求是特定于域的”

  • 我正在寻找有关此的最佳实践。那么域驱动设计的访问控制逻辑应该放在哪里,又应该如何实现呢?

    (通过 DDD + CQRS + ES 更具体。)

    我认为它应该靠近业务逻辑,例如用户故事可能是这样的:

    The user can edit his profile by sending an user name, a list of hobbies, cv, etc...



    基于用户故事,我们实现了领域模型和服务,例如:
    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

    但是我们应该在哪里执行这个规则,我们应该如何执行它?

    最佳答案

    So where should I put the access control logic?



    据此: https://softwareengineering.stackexchange.com/a/71883/65755政策执行点应该在 UserService.editProfile() 调用之前.

    我得出了同样的结论:它不能在 UI 中,因为在多个 UI 中我们会有代码重复。应该在创建领域事件之前,因为它们表明我们已经在系统中做了一些事情。因此,我们可以限制对域对象或使用这些域对象的服务的访问。通过 CQRS,我们不需要读取模型的域对象,只有服务,所以如果我们想要一个通用的解决方案,我们必须限制对服务的访问。我们可以将访问决策放在每个服务操作的开始,但这将是 grant all, deny x安全反模式。

    How should I implement it?



    这取决于哪种访问控制模型适合域,因此它取决于用户故事。通过访问决策,我们通常会发送访问请求并等待许可作为返回。访问请求通常有以下几个部分:主体、资源、操作、环境。因此,主体需要权限才能对环境中的资源执行操作。首先我们识别主题,然后我们对其进行身份验证,然后是授权,在此我们检查访问请求是否符合我们的访问策略。每个访问控制模型都以类似的方式工作。办公室他们可能缺少其中一些步骤,但这并不重要......

    我创建了一个访问控制模型的简短列表。我将规则、策略放入注释中,但如果我们想要一个易于维护的系统,通常我们应该将它们存储在数据库中,可能以 XACML 格式...
  • 通过基于身份的访问控制(IBAC),我们有一个身份-权限存储(访问控制列表、能力列表、访问控制矩阵)。因此,例如通过访问控制列表,我们存储可以拥有权限的用户或组的列表。
    UserService
    @AccessControlList[inf3rno]
    editProfile(EditUserProfileCommand command)
  • 通过基于格的访问控制(LBAC),主体具有许可级别,资源具有所需的许可级别,我们检查哪个级别更高......
    @posseses[level=5]
    inf3rno

    UserService
    @requires(level>=3)
    editProfile(EditUserProfileCommand command)
  • 通过基于角色的访问控制 (RBAC),我们定义了主体角色,并向扮演实际角色的主体授予权限。
    @roles[admin]
    inf3rno

    UserService
    @requires(role=admin)
    editProfile(EditUserProfileCommand command)
  • 通过基于属性的访问控制 (ABAC),我们定义主题、资源和环境属性,并根据它们编写我们的策略。
    @attributes[roles=[admin]]
    inf3rno

    UserService
    @policy(subject.role=admin or resource.owner.id = subject.id)
    editProfile(EditUserProfileCommand command)
    @attribute(owner)
    Subject getOwner(EditUserProfileCommand command)
  • 通过基于策略的访问控制 (PBAC),我们不会将我们的策略分配给其他任何东西,它们是独立的。
    @attributes[roles=[admin]]
    inf3rno

    UserService
    editProfile(EditUserProfileCommand command)
    deleteProfile(DeleteUserProfileCommand command)
    @attribute(owner)
    Subject getOwner(EditUserProfileCommand command)

    @permission(UserService.editProfile, UserService.deleteProfile)
    @criteria(subject.role=admin or resource.owner.id = subject.id)
    WriteUserServicePolicy
  • 通过风险自适应访问控制 (RAdAC),我们根据主体的相对风险状况和操作的风险级别做出决定。这不能用我认为的规则来描述。我不确定实现,也许这就是 stackoverflow 使用的点系统。
  • 通过基于授权的访问控制 (ZBAC),我们不进行身份验证和身份验证,而是为身份识别因素分配权限。例如,如果有人发送 token ,那么她就可以访问服务。其他一切都类似于以前的解决方案。以 ABAC 为例:
    @attributes[roles=[editor]]
    token:2683fraicfv8a2zuisbkcaac

    ArticleService
    @policy(subject.role=editor)
    editArticle(EditArticleCommand command)

    所以大家知道2683fraicfv8a2zuisbkcaac token 可以使用该服务。

  • 等等...

    还有许多其他型号,最适合的型号始终取决于客户的需求。

    所以总结一下
    - "security concerns should be handled outside the domain"
    - "access control requirements are domain specific"

    两者都可以,因为安全性不是域模型的一部分,但其实现取决于域模型和应用程序逻辑。

    2年后编辑
    2016-09-05

    由于我作为 DDD 新手回答了自己的问题,因此我已阅读 Implementing Domain-Driven Design来自沃恩弗农。这是一本关于这个主题的有趣的书。这是它的引述:

    This constitutes a new Bounded Context - the Identity and Access Context - and will be used by other Bounded Contexts through standard DDD integration techniques. To the consuming contexts the Identity and Access Context is a Generic Subdomain. The product will be named IdOvation.



    因此,根据 Vernon 的说法,可能是将访问控制移动到通用子域的最佳解决方案。

    关于security - 领域驱动设计中的访问控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23464697/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com