我有一个传统的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)
据我所知,我的选择是:
然而,这些似乎都不直观.我错过了什么吗?
它不是最优雅的解决方案,因为它需要大量额外的样板代码,但您可以使用Gate::forUser($user)->allows()而不仅仅是来自Gate::allows()何处.$userAuth::guard()
| 归档时间: |
|
| 查看次数: |
1483 次 |
| 最近记录: |