gpt4 book ai didi

Laravel:如何将 Gates 与多个 Guards 一起使用

转载 作者:行者123 更新时间:2023-12-05 01:00:40 24 4
gpt4 key购买 nike

我有一个传统的 Web 应用程序,它有许多不同的用户类型,每种用户类型都有自己的身份验证保护。

'guards' => [

'web' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admin',
],
'timekeeper' => [
'driver' => 'session',
'provider' => 'timekeeper',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
],

我的大多数用户都使用“网络”守卫进行身份验证,但是管理员和计时员各自使用自己的守卫,该守卫附加到适当的用户提供程序。

在我尝试使用身份验证门之前,这很好。如果我根据系统的默认保护(例如“网络”)对用户进行身份验证,那么门将按预期工作。但是,如果我对任何其他 guard 进行身份验证,则所有 Gate::allows(...) 调用都将被拒绝。

甚至以下能力被拒绝:

Gate::define('read', function ($user) {
return true;
});

这可能是由于 Illuminate\Auth\Access\Gate 中的第 284-286 行:

if (! $user = $this->resolveUser()) {
return false;
}

据我所知,我的选择是:

  • 回到使用单一的“网络”保护,用户提供者可以定位任何类型的用户(但我不确定如果我开始并行使用 API 会如何工作)
  • 根据当前用户的类型,以某种方式在运行时设置默认保护。 (目前在配置文件中设置)
  • 以某种方式将不同的用户解析器注入(inject)到 Gate 门面(同样,取决于当前用户的类型)

然而,这些似乎都不直观。我错过了什么吗?

最佳答案

这不是最优雅的解决方案,因为它需要大量额外的样板代码,但您可以使用 Gate::forUser($user)->allows() 而不仅仅是 Gate::allows() 其中 $user 来自 Auth::guard()

关于Laravel:如何将 Gates 与多个 Guards 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48273308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com