代码之家  ›  专栏  ›  技术社区  ›  blockhead

身份验证是我的域还是我的应用程序的问题?

  •  1
  • blockhead  · 技术社区  · 15 年前

    $user->authenticate($authenticator);
    $user->login($authenticator);
    

    或者这是一个交叉关注点,我会反过来做。

    $authenticator->authenticate($user);
    $session->setUser($user);
    

    第一种方式对我来说似乎更“OO”,因为我不必向我的用户对象询问任何事情……它传递验证器需要的信息。但感觉上我在某个方面“污染”了我的域…登录不是我的应用程序的业务要求…这是一个副作用,因为我需要一种身份验证方法来保护我的应用程序。

    3 回复  |  直到 15 年前
        1
  •  4
  •   Mark Seemann    15 年前

    除非您的域将身份验证作为一个中心概念,否则我会说它是一个交叉关注点,而不是域模型的一部分。

    大多数开发人员编写的业务应用程序模型与软件安全性完全不同。身份验证是许多应用程序中非常重要的一部分,但实际上与域本身无关。

    这并不意味着您不能以面向对象的方式处理身份验证。

    在里面 Domain-Driven Design 核心域 而您可以选择在 一般子域

        2
  •  1
  •   Peter D    15 年前

    IMHO传递验证器是不好的OO。为什么用户应该了解如何对自己进行身份验证?它是一个用户,甚至不需要知道验证器是什么。此外,传递验证器对我来说似乎很奇怪,除非您计划采用不同的方式对用户进行身份验证,因此需要向您的用户传递不同类型的验证器。你让它看起来好像身份验证不是你的应用程序的主要部分,所以我怀疑你会有不止一种方式来验证用户。

    我认为你的第二种方法更有意义,尽管在我看来还是有些过分。我最喜欢的框架是symfony,他们有一个很棒的插件,名为sfGuard,可以处理身份验证。看一看 source code of the plugin

        3
  •  1
  •   Justin Johnson    15 年前

    耦合

    $user->authenticate($authenticator);
    $user->login($authenticator);
    

    控制反转

    $authenticator->authenticate($user);
    $session->setUser($user);