我有一个传统的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;
}
据我所知,我的选择是:
然而,这些似乎都不直观。我错过了什么吗?
答案 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()
。