我在Laravel 6策略方面遇到了一些问题。我一直收到 403 未经授权的请求,即使它应该是未经身份验证的请求。
文件:
接口.php
Route::prefix('v2')
->group(function () {
Route::prefix('agencies')->group(function () {
Route::post('/', 'ApiAgencyController@store');
});
}
代理控制.php
<?php
namespace AppHttpControllersApi;
use AppEntitiesAgency;
class AgencyController extends Controller {
public function store(AgencyRequest $request)
{
$this->authorize('create', Agency::class);
// Code that is never executed
}
}
代理政策.php
class AgencyPolicy
{
public function create(User $user)
{
Log::info('hello?'); // This Log is never executed
return true;
}
}
身份验证服务提供商.php
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
AppEntitiesAgency::class => AppPoliciesAgencyPolicy::class,
// Other policies
];
public function boot()
{
$this->registerPolicies();
Gate::before(function ($user) {
if ($user->hasRole(SuperAdmin::ROLE_NAME)) {
return true;
}
});
Passport::routes(null, ['prefix' => 'api/oauth']);
}
}
我的代码与文档相同,但尽管如此,我仍然不断获得未经授权的 403,对于我的生活,我无法理解发生了什么。所有的帮助将不胜感激。
正如lagbox谢天谢地回答的那样,答案在文档中,其中指出:
默认情况下,如果传入的 HTTP 请求不是由经过身份验证的用户发起的,则所有入口和策略都会自动返回 false。但是,您可以通过声明"可选"类型提示或为用户参数定义提供 null 默认值来允许这些授权检查传递到您的入口和策略:
因此,我的问题可以通过在AgencyPolicy中使用?User
来解决.php:
class AgencyPolicy
{
public function create(?User $user)
{
return true;
}
}
这就解决了问题。