授权后未调用Laravel 6.x策略(无中间件)

时间:2019-12-18 10:56:35

标签: php laravel laravel-6.2

我在Laravel 6政策上遇到了一些问题。我始终会得到403未经授权,即使它应该是未经验证的请求。

文件:

api.php

Route::prefix('v2')
  ->group(function () {
        Route::prefix('agencies')->group(function () {
            Route::post('/', 'Api\AgencyController@store');
        });
    }

AgencyController.php

<?php

namespace App\Http\Controllers\Api;

use App\Entities\Agency;

class AgencyController extends Controller {
    public function store(AgencyRequest $request)
    {
        $this->authorize('create', Agency::class);

        // Code that is never executed
    }
}

AgencyPolicy.php

class AgencyPolicy
{
    public function create(User $user)
    {
        \Log::info('hello?'); // This Log is never executed
        return true;
    }
}

AuthServiceProvider.php

class AuthServiceProvider extends ServiceProvider
{
    protected $policies = [
        \App\Entities\Agency::class => \App\Policies\AgencyPolicy::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的未经授权,并且我一生无法理解正在发生的事情。所有帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

感谢lagbox replied,答案在文档中指出:

  

默认情况下,如果传入的HTTP请求不是由经过身份验证的用户发起的,则所有门和策略都会自动返回false。但是,您可以通过声明“可选”类型提示或为用户参数定义提供空默认值来允许这些授权检查通过您的门禁和策略:

因此,我的问题将通过在 AgencyPolicy.php 中使用?User来解决:

class AgencyPolicy
{
    public function create(?User $user)
    {
        return true;
    }
}

这解决了问题。