You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 9中ProductPolicy始终返回‘This action is unauthorized’求助

Laravel 9 中 ProductPolicy 授权始终返回未授权问题

环境信息

  • Laravel版本:9
  • PHP版本:8.1.1

问题描述

我为Product模型创建了ProductPolicy,希望每次验证用户是否具备更新/删除产品的权限,但在ProductController中执行授权操作时,始终返回提示This action is unauthorized。

我使用了默认Request类,并已在AuthServiceProvider中完成模型与策略的绑定。以下是相关文件代码:

相关代码

api.php

Route::group([
    'prefix' => 'token/{token}',
    'middleware' => 'token'
], function () {
    Route::apiResource('category', \App\Http\Controllers\Category\CategoryController::class);
    Route::apiResource('product', \App\Http\Controllers\Product\ProductController::class);
});

ProductController

namespace App\Http\Controllers\Product;

use App\Facades\CurrentBot;
use App\Http\Controllers\Controller;
use App\Models\Bot;
use App\Models\Product;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Database\Eloquent\Builder;

class ProductController extends Controller
{
    /**
     * Update the specified resource in storage.
     *
     * @param Request $request
     * @param Product $product
     * @return Response
     * @throws AuthorizationException
     */
    public function update(Request $request, Product $product)
    {
        $this->authorize('update', [$product]);

        $request->validate([
            'name' => 'string',
            'description' => 'string',
            'amount' => 'numeric',
            'thumb' => 'file|max:2048'
        ]);

        $product->fill($request->all());

        if ($request->file('thumb')) {
            $save = $request->file('thumb')->store('/public/images');
            $product->thumb = $save;
        }

        return response($product->save());
    }
}

Product 模型

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    use HasFactory;

    protected $fillable = [
        'name',
        'description',
        'thumb',
        'amount',
        'category_id'
    ];
}

ProductPolicy

namespace App\Policies;

use App\Facades\CurrentBot;
use App\Models\Product;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;
use Illuminate\Auth\Access\Response;
use Illuminate\Database\Eloquent\Builder;

class ProductPolicy
{
    use HandlesAuthorization;

    /**
     * Determine whether the user can update the model.
     *
     * @param User $user
     * @param Product $product
     * @return Response|bool
     */
    public function update(User $user, Product $product): Response|bool
    {
        return CurrentBot::me()->categories()->whereHas('products',  function (Builder $query) use ($product) {
            return $query->where('id', $product->id);
        })->exists();
    }
}

已尝试的解决方案

我已查阅资料,常见解决方案有两种:

  • 在自定义Request类中将authorize方法设为false;
  • 在AuthServiceProvider中绑定模型与策略类。

我已在AuthServiceProvider中完成如下绑定,但问题仍未解决:

protected $policies = [
    Product::class => ProductPolicy::class,
];

内容的提问来源于stack exchange,提问作者Milly Khamroev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:10:50