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

Laravel如何校验ID匹配 阻止未授权调用Controller更新预订接口

Laravel 预订记录所属权校验实现方案

关于Auth::user()的可用性

只要你的路由正确挂载了auth:api中间件、api认证配置正常,Auth::user()和你代码里用的auth('api')->user()都可以正确获取当前登录用户实例,完全支持你做用户ID交叉校验的需求。

现有代码问题

你当前的update方法存在两个可优化点:

  • 路由模型绑定已经自动注入了对应ID的$booking实例,方法内重复查询时使用了未定义的$id变量,会直接触发报错
  • 校验逻辑直接写在业务方法内,后续新增删除、详情等需要校验所属权的接口时,会产生大量重复代码

控制器内封装校验逻辑的实现

推荐方案:构造函数内统一注册校验中间件

利用Laravel控制器内置的闭包中间件能力,在方法执行前统一完成所属权校验,一次编写即可覆盖所有需要操作单条预订记录的接口(详情、更新、删除),校验不通过直接拦截请求,不会进入后续业务逻辑,完全满足你后端校验的安全要求。
控制器代码示例:

<?php

namespace App\Http\Controllers;

use App\Models\Booking;
use Illuminate\Http\Request;

class EventController extends Controller
{
    public function __construct()
    {
        // 所有接口先过api登录校验
        $this->middleware('auth:api');

        // 统一校验预订记录所属权,仅对操作单条记录的接口生效
        $this->middleware(function ($request, $next) {
            $currentBooking = $request->route('booking');
            if ($currentBooking && $currentBooking->created_by !== auth('api')->id()) {
                abort(403, '无权操作其他用户的预订记录');
            }
            return $next($request);
        })->only(['show', 'update', 'destroy']);
    }

    public function update(Request $request, Booking $booking)
    {
        // 走到此处时已经完成登录校验和所属权校验,直接处理业务即可
        $validated = $request->validate([
            'start_date' => 'required|date',
            'end_date' => 'required|date|after:start_date',
            'resourceIds' => 'required|integer'
        ]);

        $booking->fill($validated);
        $booking->save();

        return $booking;
    }

    // 其余show、destroy方法无需重复写校验逻辑,自动应用统一规则
    public function destroy(Booking $booking)
    {
        $booking->delete();
        return response()->noContent();
    }
}

轻量方案:抽离私有校验方法

如果不想在构造函数中编写逻辑,也可以在控制器内抽离一个私有校验方法,在需要校验的业务方法开头调用即可:

// 控制器内添加私有校验方法
private function validateBookingOwner(Booking $booking): void
{
    if ($booking->created_by !== auth('api')->id()) {
        abort(403, '无权操作其他用户的预订记录');
    }
}

public function update(Request $request, Booking $booking)
{
    $this->validateBookingOwner($booking);
    // 后续写更新业务逻辑即可
}

注意事项

  • 永远不要从前端请求参数中获取用户ID做权限校验,所有用户身份信息都从后端认证体系(也就是auth('api')->id())获取,从根源避免参数篡改风险
  • 路由模型绑定已经自动完成了根据URL参数查询对应记录的逻辑,不需要额外调用findOrFail重复查库,避免不必要的性能开销
  • 未登录状态下auth('api')->id()会返回null,所以一定要保证所有需要权限的接口都挂载了auth:api中间件,避免校验逻辑失效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.11 16:16:24