Laravel:如何使用盖有多个守卫的盖茨

Kim*_*nce 1 laravel laravel-5

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

'guards' => [

    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admin',
    ],
    'timekeeper' => [
        'driver' => 'session',
        'provider' => 'timekeeper',
    ],
    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
],
Run Code Online (Sandbox Code Playgroud)

我的大多数用户使用"网络"防护进行身份验证,但是管理员和计时员都使用自己的防护,后者附加到适当的用户提供商.

这很好,直到我尝试使用身份验证门.如果我针对系统的默认防护(例如"web")对用户进行身份验证,那么门将按预期工作.但是,如果我对任何其他警卫进行身份验证,那么所有Gate::allows(...)呼叫都会被拒绝.

甚至以下能力也被拒绝:

Gate::define('read', function ($user) {
    return true;
});
Run Code Online (Sandbox Code Playgroud)

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

if (! $user = $this->resolveUser()) {
    return false;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,我的选择是:

  • 回到使用单个"web"防护,使用可以找到任何类型用户的用户提供程序(但我不确定如果我开始并行使用API​​将会如何工作)
  • 以某种方式在运行时设置默认保护,具体取决于当前用户的类型.(目前在配置文件中设置)
  • 以某种方式将不同的用户解析器注入Gate门面(同样,取决于当前用户的类型)

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

Mos*_*atz 5

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