【问题标题】:DDD User Security PoliciesDDD 用户安全策略
【发布时间】:2009-03-09 20:40:37
【问题描述】:

我有一个 RentalProperty 类,看起来像这样:

class RentalProperty
{
    Money MonthlyRent;
    List<MaintainenceCall> MaintainenceCalls;
}

据我了解,使用 DDD 更改 MonthlyRent,我将获取 RentalProperty,更改 MonthlyRent 属性,然后调用 RentalPropertyRepository.Save()。将处理相同的过程以添加新的维护调用。

我遇到的问题是,例如,杂工应该能够添加维护呼叫,但不应允许更改月租。我应该如何实施这个(以及其他类似的)安全策略?

【问题讨论】:

标签: c# .net domain-driven-design


【解决方案1】:

简而言之,您应该直接在模型中应用此业务规则。在您的情况下,直接在 MonthlyRent getter 和 setter 属性中。我们都知道有很多检查和安全级别会变得多么复杂;所以,这就是规范的用途。

DDD 手册引入了规范的概念,正是为了将重点放在模型本身上。您首先像上面描述的那样设置您的 getter 和 setter 以获得功能。然后,在重构期间,通过将较长的 getter/setter 代码抽象到 Specification 类中,寻求使模型更简洁。

Employee employee = 
    employeeRepository.findEmployee(employeeID);

Specification employeeCanModifyRent = new
    Specification(
        new EmployeeHasAccessToManagement()
        , new EmployeeHasAccessToMoney());

if(employeeCanModifyRent.isSatisfiedBy(employee))
{
  rentService.changeRent();
}
else
{
  throw new exception("Access denied.");
}

阅读代码可以很清楚地知道代码的作用。这本身就是核心 DDD 概念。规范应该保持非常简单和直接。

此代码来自Domain-Driven Design Quickly,一个简短而快速的 DDD 快速阅读。这确实是一本关于 DDD 的短小精悍的书,值得花几个小时阅读。只有 100 页左右。

【讨论】:

    【解决方案2】:

    AOP。 PostSharp 真的很适合这样的东西。

    因为安全确实是一个跨领域的问题。

    【讨论】:

    • 很有趣,因为我也一直在研究这个概念。 +1
    • 安全性不像日志记录那样明显是一个跨领域的问题。在记录方面,实体之间唯一不同的是记录的内容。用户是否被授权做某事可能取决于域内的特定信息。
    猜你喜欢
    • 2013-10-12
    • 2010-09-14
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 2015-11-06
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多