【问题标题】:Where can I find information on Authentication and Authorization in the context of Domain Driven Design?在领域驱动设计的背景下,我在哪里可以找到有关身份验证和授权的信息?
【发布时间】:2009-05-07 20:46:36
【问题描述】:

我正在尝试以 DDD(领域驱动设计)的方式做事。男孩,我挣扎。在我读过的所有书籍中,身份验证都是无关紧要的,也没有提到!

我编写了自己的身份验证和会员服务,负责注册和登录用户、创建加盐密码等。我不使用 .NET 的会员提供程序,但确实依赖表单身份验证。

我已经实现了一个包含用户名、电子邮件、密码哈希、批准状态等的用户模型。

现在我想域模型的其余部分不应该与用户相关。我有一个 Person 类,用于对 Person 及其相关数据进行建模。因此,它可用于对来自用户和非用户的个人数据进行建模。 Company 类型的对象与 Persons 一起使用,而不是与 Users 一起使用。一个 Activity 被分配给一个人,而不是一个用户。

问题是,如何将 Person 模型与 User 模型关联起来?我真的不想在两个模型中的任何一个中相互引用。我是否应该创建一些名为 PersonUser 的关系模型并创建一个额外的服务来检索当前经过身份验证的用户的人员对象?

【问题讨论】:

    标签: asp.net-mvc refactoring domain-driven-design data-modeling separation-of-concerns


    【解决方案1】:

    从您介绍的内容来看,您已经掌握了一些已知事实:

    1. 每个用户都是一个人
    2. 并非每个人都是用户

    既然如此,我将扩展 person 模型以包含一个可为空的 UserId 字段,以便您可以将 User 与那些也是用户的 Person 关联起来。

    现在我还要假设您在人员模型中有几个“Fetch”方法......通过 ID、姓名、部门等检索人员......

    我会重载(或创建不同的)fetch 方法,以便也从 User 中检索 person 对象(这可以是 id 或 foll user 对象)。

    public IPerson Fetch(IUser user) {}
    

    当然,既然你知道每个用户也是一个人,我个人认为扩展用户对象以包含一个人属性并没有什么坏处或犯规......

    public interface IUser 
    {
       ...
       IPerson Person { get; set; }
    }
    

    然后,您可以像往常一样返回用户对象。也许对用户中的人员字段进行一些时髦的延迟加载...或者在获取用户对象时填充两者。

    我不确定创建 User Person 的“映射”表是否会给你带来我上面概述的任何东西(尽管你会从核心 DBA 那里获得非规范化数据的荣誉).. 对我来说,这只是一个额外的表格,可以加入以获得相同的效果。

    【讨论】:

    • 我不会那样做,但感谢您的意见。在域模型和数据库中,我已经将我的用户与我的人模型分离。已接受问题,因为您帮我解决了问题。
    • 感谢您的接受。我很想听听您是如何处理这个问题的以及您的最终解决方案是什么。我坚信保持开放的心态并学习,因为解决同一问题的许多不同方法可以帮助每个人成为更好的工程师/架构师。
    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 2010-10-05
    • 1970-01-01
    相关资源
    最近更新 更多