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

Laravel调用update_warehouse接口持续返回未授权错误求助

问题:调用update_warehouse接口始终返回权限错误

我已经写好中间件函数,且确认token有效,但调用update_warehouse接口时一直返回:

"You are not authorized to update this product."

试过删除数据库重新迁移,问题还是没解决。以下是控制器里的相关代码:

public function update_warehouse(Request $request, Product $product)
{
$loggedInUser = auth()->user();
$productId = $product->id;

if ($loggedInUser->id !== $product->user_id) {
    $message = "You are not authorized to update this product.";
    return response()->json([
        'status' => 0,
        'message' => $message,
    ]);
}

$input = $request->all();
$validator = Validator::make($input, [
    'name_scientific' => 'required',
    'name_trade' => 'required',
    'type' => 'required',
    'company' => 'required',
    'quantity' => 'required',
    'ex_date' => 'required',
    'price' => 'required'
]);

if ($validator->fails()) {
    $message = "There is an error in the inputs.";
    return response()->json([
        'status' => 0,
        'message' => $message,
        'data' => $input,
    ]);
}

$product->name_scientific = $input['name_scientific'];
$product->name_trade = $input['name_trade'];
$product->type = $input['type'];
$product->company = $input['company'];
$product->quantity = $input['quantity'];
$product->ex_date = $input['ex_date'];
$product->price = $input['price'];
$product->save();

$message = "The product has been updated successfully.";
return response()->json([
    'status' => 1,
    'message' => $message,
    'data' => $product
]);
}

排查与解决办法

  • 核对模型绑定参数:检查路由定义,确保参数名和控制器中的Product $product一致,比如路由要是Route::put('/warehouse/{product}', [你的控制器类名::class, 'update_warehouse']);,如果参数名错了,注入的产品模型会不对,自然user_id匹配不上。
  • 打印日志确认ID值:在权限判断代码前加一行日志,看看当前用户ID和产品所属用户ID到底是什么:
    \Log::info('当前用户ID:'.$loggedInUser->id.',产品所属用户ID:'.$product->user_id);
    
    去日志文件里看这两个值是不是真的不一样,说不定产品的user_id本来就不是当前登录用户的ID。
  • 确认路由走了Auth中间件:虽然你说token有效,但得确保这个接口路由确实应用了Auth中间件,不然auth()->user()可能拿不到正确的用户。
  • 检查字段类型是否一致:看看users表的id和products表的user_id字段类型是不是一样的,比如都是int,要是一个是字符串一个是数字,全等判断!==会失败。
  • 改用授权策略(可选):可以用Laravel的授权策略来管权限,更规范。创建ProductPolicy,在update方法里判断用户是否拥有该产品,然后在控制器里调用$this->authorize('update', $product);就行。

内容的提问来源于stack exchange,提问作者kareem sharaf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 18:05:32