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

时间:2018-01-16 02:34:10

标签: 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',
    ],
],

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

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

即使是以下能力也被拒绝:

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

据推测,这是由于Illuminate \ Auth \ Access \ Gate中的第284-286行:

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

据我所知,我的选择是:

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

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

1 个答案:

答案 0 :(得分:5)

这不是最优雅的解决方案,因为它需要大量额外的样板代码,但您可以使用<select name="department" class="form-control" required> <option disabled selected value> -- Select an Department -- </option> <option value="INFORMATION TECHNOLOGY" rel = "item1">INFORMATION TECHNOLOGY</option> <option value="BUSINESS LIAISON" rel = "item2">BUSINESS LIAISON</option> </select> <select name="part" class="form-control" required> <option disabled selected value> -- Select Part -- </option> <option value="HICOM1" class ="item1">HICOM1</option> <option value="HICOM2" class ="item2">HICOM2</option> </select> ********* Jquery code ********/ $('select[name=department]').on('change',function(){ var set = $('select[name=part]').find('option.' $(this).find(':selected').attr('rel')); /**** check set size is grater than 0 or not ****/ if(set.size()<0) $('select[name=part]').hide(); return; /**other wise show item selected option**/ $('select[name=part]').show(); $('select[name=department]'). show(). first(). prop('selected', true); }); 而不仅仅Gate::forUser($user)->allows() Gate::allows() $user来自Auth::guard()