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

时间:2009-12-03 19:39:15

标签: php oop

我正在尝试以面向对象的方式设计我的Web应用程序的身份验证。这是我的域名的关注,在这种情况下我会有这样的事情:

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

其中$ authenticator是我的身份验证服务的接口。

或者这是一个跨领域的问题,我会反过来做。

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

第一种方式对我来说似乎更“OO”,因为我不需要从我的用户对象中提出任何问题......它传递了验证者需要的信息。但感觉就像我在某个方面“污染”我的域名...登录不是我的应用程序的业务要求......这是一个副作用,因为我需要一种身份验证方法来保护我的应用

3 个答案:

答案 0 :(得分:3)

除非您的域名包含身份验证作为核心概念,否则我会说这是一个跨领域的问题,而不是域模型的一部分。

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

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

Domain-Driven Design术语中,您建模的业务概念是核心域的一部分,而您可以选择在通用子域中实施身份验证和其他安全概念>

我无法帮助解决特定于PHP的问题,但在.NET中,如果你正确地执行它,安全性就是由平台处理的。通过实施,这是一个真正的跨领域问题,所以它是如何在其他地方完成的(FWIW)。

答案 1 :(得分:1)

恕我直言,通过认证者是坏OO。用户为什么要了解如何进行身份验证?它是一个用户甚至不需要知道验证器是什么。此外,传递身份验证器对我来说似乎很奇怪,除非您计划使用不同的方式对用户进行身份验证,因此需要将不同类型的身份验证器传递给您的用户。您认为身份验证不是您的应用程序的主要部分,所以我怀疑您将有多种方法来验证用户。

我认为你的第二种方法更有意义,尽管对我来说似乎有点矫枉过正。我最喜欢的框架是symfony,它们有一个很棒的插件,名为sfGuard,用于处理身份验证。看看source code of the plugin,看看它是否能给你任何灵感。

答案 2 :(得分:1)

耦合

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

控制倒置

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

耦合很糟糕,反转很好。跟着后来。