Gate ::不允许在Laravel 5.3中工作

时间:2016-09-10 14:19:51

标签: php laravel laravel-5 laravel-5.3

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

以下是我的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;
      });
  }
}

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

但是这总是显示'不'而不是'确定'。

<?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';
  }
}

4 个答案:

答案 0 :(得分:4)

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

中所述

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

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

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

答案 1 :(得分:2)

您必须获得授权。如果laravel看不到用户,则返回false。

答案 2 :(得分:1)

我遇到了同样的问题,根据我的理解 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。这是我在这里的第一次活动,所以大家好,新年里一切都好。

答案 3 :(得分:1)

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