Gate :: allow () не выполняется в контроллерах

Вам не разрешено звонить 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']}}">&#160;</div>
</li>
@endif
@endforeach
</ul>
</div>

В первых двух случаях (когда он вызывается в промежуточном программном обеспечении и в контроллере) ничего не регистрируется и возвращается false;
В блейд-файле он записывает «предупреждение» и возвращает истину.

Также, вероятно, стоит упомянуть, что я использую другой gaurd (клиент) для аутентификации пользователей. Я не верю, что это корень проблем, потому что команда Gate :: allow (‘isAdmin’) работает точно так, как и ожидалось в блейд-файле. Просто не где-нибудь еще

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]