首页 > 解决方案 > 授权后未调用 Laravel 6.x 策略(无中间件)

问题描述

我在使用 Laravel 6 政策时遇到了一些问题。即使它应该是未经身份验证的请求,我总是得到 403 未经授权的请求。

文件:

api.php

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

代理控制器.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,而且我终其一生都无法理解发生了什么。所有帮助将不胜感激。

标签: phplaravellaravel-6.2

解决方案


正如 lagbox 所幸回答的那样,答案在文档中,其中指出:

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

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

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

这解决了问题。


推荐阅读