【问题标题】:Laravel allways keeping return 'This action is unauthorized.'Laravel 始终保持返回 \'This action is unauthorized.\'
【发布时间】:2023-01-31 14:47:33
【问题描述】:
  • Laravel 版本:9
  • PHP:8.1.1

我为一个模型制定了一个策略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);
});

产品控制器

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());
    }
}

产品

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'
    ];
}

产品政策

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();
    }
}

我在谷歌上做了很多搜索。只有2个解决方案:

  1. 正在我创建的Request类中将authorize函数设置为false
  2. 正在向AuthServiceProvider 添加模型和策略类。

    但是我使用的是自定义请求类,并且我已经设置了模型和策略类,即使它们在 AuthServiceProvider 中具有相同的名称,如下所示:

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

【问题讨论】:

    标签: php laravel laravel-9 policy


    【解决方案1】:

    我不知道为什么,但是当我从

    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();
    }
    

    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();
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-02
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2019-11-07
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多