philippgrashoff / userauthforatk
Requires
- php: 8.*
- atk4/data: 5.*
- atk4/login: 5.*
- philippgrashoff/atkdatamodeltraits: 5.*
Requires (Dev)
- phpstan/phpstan: 1.*
- phpunit/phpunit: ^9.5.25
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
属性。