【发布时间】: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个解决方案:
- 正在我创建的
Request类中将authorize函数设置为false。 - 正在向
AuthServiceProvider添加模型和策略类。但是我使用的是自定义请求类,并且我已经设置了模型和策略类,即使它们在
AuthServiceProvider中具有相同的名称,如下所示:protected $policies = [ Product::class => ProductPolicy::class, ];
【问题讨论】:
标签: php laravel laravel-9 policy