我使用新的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';
}
}
答案 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。或者你使用后卫。我有它是因为这个并且有类似的问题。