philippgrashoff/userauthforatk

该包最新版本(5.0.0)没有提供许可信息。

5.0.0 2024-07-02 19:55 UTC

This package is auto-updated.

Last update: 2024-09-05 06:47:28 UTC


README

动机

atk4/login 是一个现有的处理用户身份验证的仓库,但它包含大量的 UI 代码。在我看来,用户身份验证本身与 UI 没有太大关系。

我在数据层中非常需要登录用户来检查执行操作的权利、审计用户所做的更改等等。正常 atk4\login 方式是将一个 Auth 实例附加到 Atk4\Ui\App,然后它需要以某种方式传递到数据级别,以便在那里使用。由于我将应用程序的代码分割成几个“数据”和“UI”仓库,这种方法需要在数据层广泛使用 Atk4\Ui\App。这个仓库的目的是使登录用户独立于 UI 可用。

当前实现,可能的改进等

Auth 作为单例

最初,所有 Auth 操作(登录、登出、获取登录用户)都实现了静态方法,例如 Auth::getUser($somePersistence)。但这伴随着一个主要问题:ATK 模型无法序列化 - 因此,只能将登录用户字段值存储在会话中。当在多个地方使用 Auth::getUser() 时,每次调用都会创建一个新的登录用户实例。这不仅从性能角度来看不好。

我能想到的唯一解决方案是使用单例,因为在最初看来,在 atk4\data 深入添加依赖注入似乎是不可能的。可以实现一个为登录用户提供的单例“获取器”,但由于 Auth 类非常小,将整个 Auth 类实现为单例似乎开销更小。虽然代码不是很优雅,因为它会变得更长(Auth::getInstance()->getUser($somePersistence)),但它解决了可能存在多个登录用户实例的问题。

与用户模型的耦合

这个仓库附带了一个基本的用户模型。然而,这个 Auth 可以与任何用户类一起使用,因为它独立于用户类。这是通过将成功登录处理、失败登录处理和登录前处理(登录失败次数过多?)的责任移至用户模型来实现的。通常,这种责任可以很好地放入 Auth,但这也意味着 Auth 需要知道用户类的功能。

在当前实现中,Auth 仅调用用户模型的钩子,因此 Auth 不需要了解用户类。因此,可以轻松地交换用户类。

不使用 atk 会话处理

目前,这个仓库没有使用 Atk 会话处理,因为我只需要将登录用户数据存储在会话中的最小功能。然而,可以轻松地使用正常的 Atk 会话处理器。

(不可能)Auth 的配置

我不太喜欢的一个问题是,在当前实现中 Auth 不可配置。如果您想使用提供的用户类以外的其他用户类,您将不得不创建一个新的 Auth 类,该类扩展了此 Auth,只是覆盖了 $userModel 属性。