laravel 多租户后台按订单 id 查详情时,把登录用户的 tenant_id 和订单 id 一起放进查询条件。这样即使请求传入别的租户的订单 id,也只能得到 404。
将详情路由放在认证之后
示例假设账号只属于一个租户,users 和 orders 都保存 tenant_id,且成员均有本租户的订单读取权。把下面代码加入 routes/web.php。
use App\Http\Controllers\OrderController;
use Illuminate\Support\Facades\Route;
Route::get('/orders/{id}', [OrderController::class, 'show'])
->whereNumber('id')
->middleware('auth');
如果业务还区分角色,应继续用策略检查当前账号的权限。
从登录用户取得租户条件
把方法加入已有 OrderController。租户 ID 来自服务端认证身份。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
public function show(\Illuminate\Http\Request $request, string $id)
{
$tenantId = $request->user()->tenant_id;
abort_if($tenantId === null, 403);
$order = \Illuminate\Support\Facades\DB::table('orders')
->select('id', 'status')
->where('tenant_id', $tenantId)
->where('id', $id)
->first();
abort_if($order === null, 404);
return response()->json($order);
}详情只返回接口需要的字段。列表、导出和更新也应分别核对租户约束。
测试篡改请求里的租户参数
把这段放进已有 Laravel 功能测试方法。示例假定 fixture 中 tenantOneUser 已登录后可查本租户订单,foreignOrder 属于另一个租户。
$this->actingAs($tenantOneUser)
->getJson('/orders/' . $ownOrder->id)
->assertOk();
$this->actingAs($tenantOneUser)
->getJson('/orders/' . $foreignOrder->id
. '?tenant_id=' . $foreignOrder->tenant_id)
->assertNotFound();本租户订单应返回 200,跨租户和不存在的订单应返回 404。

















