Вам не разрешено звонить Gates
в контроллерах? Насколько я видел там нет документации, которая говорит, что вы не должны.
Я работал вокруг, используя Gate::allows()
авторизовать моих пользователей в зависимости от того, являются они администратором или нет. Если они администраторы, разрешите им доступ к страницам Admin Controller, но если нет, то исключите их. Я использовал AdminMiddleware, который звонил Gate::allows('isAdmin')
проверить, является ли пользователь администратором или нет. Я заметил, что функция Gate всегда возвращала false, не выполняя фактический код, определенный в Gate.
Я также попытался переместить код для извлечения промежуточного программного обеспечения в контроллер, и он также отказался выполнять код Gate.
Однако, когда я добавил проверку в один из моих блейд-файлов, он работал как ожидалось.
Есть что-то, чего мне не хватает?
Вот мой AuthServiceProvider, где определены ворота:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Gate::define('isAdmin', function ($user) {
\Log::alert("alert");
return $user->is_admin == true;
});
}
}
Вот промежуточное ПО:
namespace App\Http\Middleware;
use Closure;
class AdminMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if($guard == 'client' && \Auth::guard($guard)->check()){
\Log::alert(\Gate::allows('isAdmin'));
if(\Gate::allows('isAdmin')){
return $next($request);
}
}
return redirect('client/login');
}
}
Вот мой контроллер:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
...
class AdminController extends Controller
{
protected $navClass = "nb-admin";
public function __construct(){
$this->middleware('admin:client');
}
public function add(){
dd(\Gate::allows('isAdmin'));
$Page = $this->defaultPage("","Video Training");
$Page['custom-fancybox'] = 'video';
$Nav = Nav::getNav($this->navClass);
return View('admin/add',compact('Nav','Page'));
}
protected function defaultPage($page_title,$top_page_header_title){
return PageValues::init()
->page_info($page_title,$top_page_header_title)
->get();
}
}
Но вот код Gate в моем блейд-файле, где он на самом деле работает:
<div class="sf-navbar">
<ul class="sf-menu">
@foreach($Nav as $key => $node)
@if(($node['Auth'] != "admin" && \Auth::guard('client')->check() ) ||
\Gate::allows('isAdmin')
)
<li class="{{$node['Class']}}"><a href="{{$node['Link']}}">{{$key}}</a>
<div class="menu-nb-bar" id="{{$node['Class']}}"> </div>
</li>
@endif
@endforeach
</ul>
</div>
В первых двух случаях (когда он вызывается в промежуточном программном обеспечении и в контроллере) ничего не регистрируется и возвращается false;
В блейд-файле он записывает «предупреждение» и возвращает истину.
Также, вероятно, стоит упомянуть, что я использую другой gaurd (клиент) для аутентификации пользователей. Я не верю, что это корень проблем, потому что команда Gate :: allow (‘isAdmin’) работает точно так, как и ожидалось в блейд-файле. Просто не где-нибудь еще
Задача ещё не решена.
Других решений пока нет …