Gate::allows 在 Laravel 5.3 中不工作

Gate::allows not working in Laravel 5.3

我在 Laravel 5.3 上使用新的 Gate::allows 方法有问题。

这是我的 AuthServiceProvider.php 测试:

<?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('settings', function ($user)
      {
          return true;
      });
  }
}

通常,无论用户的角色如何,每个人都可以访问设置。

但这总是显示 'no' 而不是 'ok'。

<?php

namespace App\Http\Controllers;

use Gate;
use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

class SettingsController extends Controller
{
  public function __construct(Request $request)
  {
    echo Gate::allows('settings') ? 'ok' : 'no';
  }
}

从 Laravel 5.3 开始,我们无法访问控制器构造函数中的会话或经过身份验证的用户,如 upgrade guide

中所述

由于 Gate facades 使用 User 模型,它可能会尝试访问用户,但它尚未在控制器的构造函数中准备就绪

因此,您应该考虑使用中间件来检查 Gate。您还可以直接在控制器构造函数中使用基于闭包的中间件:

public function __construct(Request $request)
{
    $this->middleware(function ($request, $next) {
        echo Gate::allows('settings') ? 'ok' : 'no';
    });
}

您必须获得授权。如果 laravel 没有看到用户,它 returns false。

我遇到了同样的问题,据我所知 AuthServiceProvider 是在 \App\Providers 下的命名空间所以如果你把 类 在没有全局命名空间的 $policies 属性中,它们也被命名为 \App\Providers .. 所以在你的情况下 \App\Providers\App\Model\App\Providers\Policies\ModelPolicy.

总而言之,尝试这样的 $policies 属性:

  protected $policies = [
      \App\Model::class => \App\Policies\ModelPolicy::class,
  ];

希望对您有所帮助:)

PS。第一次来activity,大家好,新年快乐

您必须获得授权。如果 laravel 看不到用户,则 returns 错误。或者你使用守卫。我有它是因为这个并且有类似的问题。