laravel authorizeResource始终拒绝访问

时间:2019-05-08 10:07:55

标签: laravel laravel-middleware laravel-nova laravel-5.8

我已经为api端点创建了一个资源控制器。我还为该模型创建了相应的策略。

如果我使用

进行按方法授权检查
    $this->authorize('delete', $asset);

然后它可以按预期工作,但是如果我将以下内容添加到构造中,那么我总是会被禁止使用403。

不确定我要缺少什么,因为这应将授权应用于所有方法。

    $this->authorizeResource(Asset::class,'asset');

这就是我的路线

Route::group(['middleware' => ['auth:api']], function () {
    Route::Resource('asset','AssetsApiController');
});

我的保单是这样注册的

protected $policies = [
    Asset::class => AssetPolicy::class,
];

我删除的政策方法是

public function delete(User $user, Asset $asset)
{
    return true;
}

API控制器的构造函数是

public function __construct()
{
    $this->authorizeResource(Asset::class,'asset');
}

API控制器方法是

   public function destroy($assetID)
    {
        $asset = Asset::findOrFail($assetID);
        $asset->delete();
    }

我的路线列表是

|        | GET|HEAD  | api/asset                                                                                  | asset.index           | App\Http\Controllers\AssetsApiController@index                                              | api,auth:api                                                                                                                                                                      |
|        | POST      | api/asset                                                                                  | asset.store           | App\Http\Controllers\AssetsApiController@store                                              | api,auth:api,can:create,App\Asset                                                                                                                                                 |
|        | GET|HEAD  | api/asset/create                                                                           | asset.create          | App\Http\Controllers\AssetsApiController@create                                             | api,auth:api,can:create,App\Asset                                                                                                                                                 |
|        | PUT|PATCH | api/asset/{asset}                                                                          | asset.update          | App\Http\Controllers\AssetsApiController@update                                             | api,auth:api,can:update,asset                                                                                                                                                     |
|        | DELETE    | api/asset/{asset}                                                                          | asset.destroy         | App\Http\Controllers\AssetsApiController@destroy                                            | api,auth:api,can:delete,asset                                                                                                                                                     |
|        | GET|HEAD  | api/asset/{asset}                                                                          | asset.show            | App\Http\Controllers\AssetsApiController@show                                               | api,auth:api,can:view,asset                                                                                                                                                       |
|        | GET|HEAD  | api/asset/{asset}/edit                                                                     | asset.edit            | App\Http\Controllers\AssetsApiController@edit                                               | api,auth:api,can:update,asset                                                                                                                                                     |
|        | GET|HEAD  | assets                                                                                     |                       | App\Http\Controllers\AssetsController@index                                                 | web                                                  

我想我丢失了一些东西,但我看不到,因为望远镜显示该门被拒绝了。唯一奇怪的是,serveNova中间件似乎是被拒绝的来源

Time 2019年5月8日,10:51:37 AM(1400万年前) 主机名核心 能力删除 结果被拒绝 位置/home/vagrant/code/nova/src/Http/Middleware/ServeNova.php:25 请求查看请求 标签Auth:1

4 个答案:

答案 0 :(得分:1)

我已经在https://github.com/laravel/framework/issues/22847#issuecomment-521308861处描述了我的课程,学习了这个累人的问题。也许有人会觉得有用。

答案 1 :(得分:0)

我遇到了同样的问题,并通过更改控制器方法的签名解决了该问题。 默认情况下,控制器接收一个整数$id来引用模型,而策略则直接接收模型实例。我的直觉是无法在控制器和策略之间进行映射。

因此,我建议尝试将控制器方法更改为:

   public function destroy(Asset $asset)
    {
        $asset->delete();
    }

我不知道这是一个错误吗?我没有找到有关这些方法类型签名约定的文档。

答案 2 :(得分:0)

我发现正确获取AuthorizeResource的Model标识符参数非常麻烦。当参数丢失或传递不正确时,策略之前的步骤将引发错误(不是请求策略本身,因为请求永远不会发送给策略)。就我而言,这意味着我的CheckUserActive中间件引发了错误,即使该错误是在Controller的Construct函数中(而不是中间件)。有关AuthorizeResource寻找的参数的一些注意事项:

  1. 即使参数以大写形式声明,也必须小写 模型中的情况。
  2. 必须是字符串(许多示例中都没有使用定义$的变量。)
  3. 必须在单引号内。

例如:

$this->authorizeResource(Model::class, 'parameter');

答案 3 :(得分:0)

我通过删除第二个参数解决了这个问题:

    public function __construct()
{
    $this->authorizeResource(Admin::class);
}