【问题标题】:Domain security involving domain logic涉及域逻辑的域安全
【发布时间】:2014-04-25 15:05:21
【问题描述】:

与我的应用程序的域逻辑一起,我试图概述安全模型。我坚持一个要求,使我无法将安全性视为对我的域逻辑的横切关注点。以下是我的情况。

我的系统中的用户可能被允许创建某种对象,例如“过滤器”。我引入了一个名为“CREATE_FILTER”的权限,用户是否可以创建过滤器,这取决于管理员是否为该用户分配了这样的权限。好的。

现在考虑一个更复杂的要求,即用户可以创建的过滤器数量有限。所以,例如管理员应该能够设置允许任何用户创建的过滤器的最大数量,或者更复杂的是,将最大数量单独分配给用户,例如 User1 的值为 3,User2 的值为 5,依此类推。因此,为了授权用户创建过滤器,安全系统不足以检查用户是否分配了这样的权限,而是必须以复杂的方式分析域模型以查看有多少过滤器已经由用户创建来做出决定。为了使事情变得更复杂,我们可以想象最大限制将取决于用户在其帐户中的金额或其他东西。

我想从概念上分离(至少在我看来),这样一个复杂的安全逻辑是否纯粹与安全有关(这当然取决于域模型)还是这已经是域逻辑的成熟部分本身?当分配/删除权限没有多大帮助时(因为它的域状态取决于授权决策而不是分配的权限),保持“权限”概念是否有意义?比如说,拥有一个复杂的许可概念,它不是简单地通过其存在的事实来允许一个动作,而是涉及一些复杂的决策逻辑,这是否是一种方法?

【问题讨论】:

    标签: security domain-driven-design


    【解决方案1】:

    这是您可以处理此问题的一种方法...

    一方面,您有一个安全模型(可能是 ddd 语言中的有界上下文),它可以通过使用角色来解决将权限分配给主题(用户)的问题。我会设想上限(最大数量)是与分配的权限相关联的属性。

    这个模型还有一个查询部分。然而,它只能回答“简单”的问题:

    • 此用户有创建过滤器的权限吗?
    • 此用户可以创建多少个过滤器?

    有些人甚至会说这个查询部分完全是一个单独的模型。

    另一方面,除了“用户 John Doe 只能创建 3 个过滤器”这些讨厌的要求之外,您的应用程序模型在很大程度上是“安全”免费的。顺便说一句,我们现在仍然在谈论“用户”,而不是在这个特定用例中扮演特定角色的人,这是值得怀疑的。无论如何,回到我们如何保持这有点分开。假设我们有一个有点分层的方法,我们有一个应用程序服务,前面有一个授权服务。授权服务的职责是回答“是否允许此用户执行此操作?是或否?”的问题。如果答案是否定的,则停止处理。这是一个非常幼稚的版本(C#)。

    public class FilterAuthorizationServices :
      Handles<CreateFilter>
    {
      public FilterAuthorizationServices(FilterRepository filterRepository) { ... }
    
      public void Authorize(Subject subject, CreateFilter message)
      {
        if(!subject.HasPermissionTo("CreateFilter"))
        {
          throw new NotAuthorizedException("...");
        }
    
        if(filterRepository.CountFiltersCreatedBy(subject.Id) > 
             subject.GetTheMaximumNumberOfFiltersAllowedToCreate()) 
        {
          throw new NotAuthorizedException("...");
        }
      }
    }
    

    请注意这里甚至没有提到应用程序服务。它可以专注于调用实际的域逻辑。然而,授权服务同时使用上述模型的查询部分(由 Subject 体现)和应用程序的模型(由 FilterRepository 体现)来完成授权请求。这样做没有错。

    如果该模型能够以某种方式向安全模型提供“当前创建的过滤器数量”,您甚至可以更进一步,放弃对应用程序模型的需求。但这对你来说可能是一座太远的桥梁,因为这会导致评估动态表达式的路径(这不一定是一个糟糕的地方)。如果你想去那里,我建议你创建一个迷你 DSL 来定义所需的表达式和相关的代码来解析和评估它们。

    如果您想要代理授权,您可以查看 XACML (https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=xacml) 之类的东西,不过您必须先克服对 XML 的恐惧 ;-)

    【讨论】:

    • 非常感谢 Yves 的详尽回答,让我们深思。我期待这样的事情能够为我进一步的搜索和学习(特别是在 ddd 中)获得立足点。
    猜你喜欢
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    相关资源
    最近更新 更多